STATA цикл foreach странное поведение
Я получаю странное поведение (он генерирует только пропущенные значения) из следующего цикла -
foreach x имени varlist { egen totalcap
x'=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
использует цикл, но он находится внутри кода).