STATA цикл foreach странное поведение

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

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

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

egen totalcapSOMENAME= всего (кепка) если единица!=0 & name=="SOMENAME", (год)

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

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

1 ответ

Решение

У вас есть пара вопросов здесь. Самое главное, что ваш первый цикл оценивает слово "name" вместо "x" во всем цикле. Таким образом, он запускает вашу команду -egen- как:

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

Я сомневаюсь, что это то, что вы действительно хотите - я думаю, что вы хотите, чтобы он оценивался по каждому элементу (наблюдению) в вашей переменной "name", так как вы использовали оператор if name == "x'". So, you need to either get rid of the double quotes around the "x '"в вашем операторе -if- ИЛИ установите локальный макрос и задайте цикл egen для оценки каждого элемента в вашей переменной" name ".

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

Вот пример того, что я думаю, вы хотите запустить. В целях иллюстрации я использую встроенный набор данных "auto.dta" Stata для запуска вашего оператора loop & standalone -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 оценивает ваш цикл.

Хотя вышеприведенный ответ был принят (почти 11 лет назад), в вопросе есть недоразумение, которое часто встречается и заслуживает немного большего внимания, чем в полезном ответе @eric.a.booth.

Недоразумение в том, что

foreach x of varlist name 

каким-то образом автоматически представляет собой цикл по отдельным (некоторые говорят "уникальный", но, на мой взгляд, это не лучший термин) значениям переменной name. Другое программное обеспечение может сделать это за вас, но это ни в коем случае не то, что обещает Stata.foreach. Это цикл только по одному элементу, единственному имени переменной в предоставленном списке переменных. Таким образом, это излишество, поскольку вы можете просто ввести оператор (ы) внутри цикла, но Stata, естественно, не запрещает список переменных с одним именем или использование его вforeach.

В данном конкретном случае

egen totalcap = total(cap) if unit!=0, by(name year) 

поместит все интересующие итоги в одну переменную, и если вы предпочитаете, чтобы это было несколько переменных, используйте separate сделать это без цикла (точнее, separate использует цикл, но он находится внутри кода).

Другие вопросы по тегам