Вопрос

Я получаю странное поведение (оно генерирует только пропущенные значения) из следующего цикла -

  

foreach x имени varlist {egen   totalcap x '= total (cap) if unit! = 0 & amp;   name == " x '" ;, (год)}

Но если бы я должен был сделать просто

  

egen totalcapSOMENAME = общее (ограничение), если   единица измерения = 0 & amp; name == " SOMENAME " ;, (год)

затем он вычисляет числа, которые он должен вычислить.

Это набор данных панели, единица обозначает число в силовой установке конкретного генераторного агрегата (единицы с номером 0 являются наблюдениями на уровне завода). Переменная cap установленной мощности. Переменная name идентифицирует растение. Сложно объяснить, зачем мне нужен этот цикл, но проблема явно в том, как STATA интерпретирует foreach.

Это было полезно?

Решение

У вас есть пара вопросов здесь. Самое главное, что ваш первый цикл оценивает слово «имя» вместо "x" на протяжении всей вашей петли. Поэтому он запускает вашу команду -egen- как:

foreach x of varlist name {
     egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}

Я сомневаюсь, что это то, что вы действительно хотите - я думаю, что вы хотите, чтобы оно оценивалось по каждому элементу (наблюдению) в вашем " имени " переменная, поскольку вы использовали имя оператора if == " x '" ;. Итак, вам нужно либо избавиться от двойных кавычек вокруг " x '" в вашем операторе -if- ИЛИ установите локальный макрос и настройте цикл egen для оценки каждого элемента в вашем " имени " переменная.

Вторая ошибка, которую я вижу в вашем коде, заключается в том, что вы пропускаете прямую или левую кавычку для " x " в цикле - это должно читаться как "x" " , а не "x" ".

Вот пример того, что, я думаю, вы хотите запустить. Для наглядности я использую встроенный Stata " auto.dta " набор данных для запуска вашей петли & amp; автономный оператор -egen- ... обратите внимание, что я переименую переменные в auto.dta в имена ваших переменных:

***********
clear
sysuse auto


**
//this section renames the auto.dta variables to the name of your variables//

gen year = [_n]
rename mpg cap
rename price unit
rename make name
**NOTE:  your "SOMENAME" will be "Subaru" in this example!**
**

//here's the loop you should be running//

foreach x of varlist name {
 egen totalcap`x'=total(cap) if unit!=0 & name==`x', by(year) 
 }

//without the loop//

egen totalcapSOMENAME=total(cap) if unit!=0 & name=="Subaru", by(year)

//Display the results//

li name unit cap totalcap* if !missing(totalcapSOMENAME)
***********

Попробуйте запустить этот пример в do-файле Stata. Кроме того, когда возникают проблемы такого рода (когда цикл создает другой результат, чем отдельная команда), всегда пытайтесь ввести -set trace on-, чтобы увидеть, как Stata оценивает ваш цикл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top