comportamento estranho laço STATA® foreach
Pergunta
Estou recebendo um comportamento estranho (ele gera apenas valores em falta) a partir do seguinte loop -
foreach x do nome varlist {egen totalcap
x'=total(cap) if unit!=0 & name=="
x '", de (ano)}
Mas, se eu fosse fazer apenas
= egen totalcapSOMENAME total (cap) se unidade! = 0 & nome == "somename", de (ano)
, em seguida, ele calcula os números que ele é suposto computação.
Trata-se de um painel de dados, o número de unidades dentro designa um motor de uma unidade de gerador especial (unidades numeradas de 0 são observações de nível de planta). A variável tampa é a capacidade instalada. A variável nome identifica a planta. É complicado para explicar por que eu preciso deste loop, mas o problema é claramente com a maneira como STATA interpreta foreach.
Solução
Você tem um par de questões aqui. Mais importante ainda, o seu primeiro ciclo está avaliando a palavra "nome" no lugar de "x" em todo o seu ciclo. Portanto, a sua execução de seu comando -egen- como:
foreach x of varlist name {
egen totalcapname = total(cap) if unit!=0 and name=="name", by(year)
}
Eu duvido que isso é o que você realmente quer - Eu acho que você quer que ele para avaliar por cada item (observação) na variável "nome" desde que você usou o se nome de instrução == "x'". So, you need to either get rid of the double quotes around the "
x '" em sua -if- declaração ou configurar uma macro local e ajuste o circuito egen para avaliar para cada item na sua variável "nome".
O segundo erro que eu vejo em seu código é que você está faltando a citação para a frente ou para a esquerda para o "x" no loop -. Deve ler-se "` x '", não" x'
Aqui está um exemplo do que eu acho que você deseja executar. Para fins de ilustração, eu estou usando o Stata embutido "auto.dta" conjunto de dados para executar o seu ciclo e autônomo declaração -egen- ... Por favor, note que eu renomear as variáveis ??no auto.dta aos nomes de suas variáveis:
***********
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)
***********
Tente executar este exemplo em um arquivo .do Stata. Além disso, quando você tem este tipo de questões (onde o laço cria um resultado diferente do que a sós comando suporte), sempre tentar digitação -conjunto traçar on- de modo que você pode ver como Stata está avaliando o seu loop.