2015-02-23 1 views
0

Я написал программу ниже и продолжаю получать сообщение об ошибке, что мои переменные не определены.Ошибка: «нет переменных, определенных» в stata при использовании моделирования monte carlo

Может ли кто-нибудь посмотреть, где ошибка, и как я должен адаптировать код? На самом деле ничего не работает.

program define myreg, rclass 
drop all 

set obs 200 
gen x= 2*uniform() 
gen z = rnormal(0,1) 
gen e = (invnorm(uniform()))^2 
e=e-r(mean) 
replace e=e-r(mean) 
more 
gen y = 1 + 1*x +1*z + 1*e 
reg y x z 
e=e-r(mean) 
replace e=e-r(mean) 
more 
gen y = 1 + 1*x +1*z + 1*e 
reg y x z 
more 
return scalar b0 =_[_cons] 
return scalar b1=_[x] 
return scalar b2 =_[z] 
more 
end 

simulate b_0 = r(b0) b_1 = r(b1) b_2 = r(b2), rep(1000): myreg 
+1

'e = e-r (mean)' здесь незаконно. Он также избыточен, так как это «замена». Но если вы не выполнили «подведение итогов» перед запуском этого, нет 'r (mean)', чтобы использовать так, чтобы 'e' заканчивалось тем, что не было. Стилистическая точка заключается в том, что если ваша Stata допускает «rnormal()», она допускает «runiform()», и вам не нужно использовать более старые имена функций для генерации случайных чисел. –

+1

'drop all' катит переменную, называемую' all', если она существует. Вы можете означать 'drop _all'. –

+1

Первый «регресс» в программе бессмыслен, поскольку вы никогда не используете его результаты. Если вы считаете, что 'r (mean)' оставлен «регрессом», это совершенно неправильно. –

ответ

1
*A possible solution with eclass 

capture program drop myreg 
program define myreg, eclass 
* create an empty data by dropping all variables 
drop _all 

set obs 200 
gen x= 2*uniform() 
gen z = rnormal(0,1) 
gen e = (invnorm(uniform()))^2 
qui sum e /*to get r(mean) you need to run sum first*/ 
replace e=e-r(mean) 
gen y = 1 + 1*x +1*z + 1*e 
reg y x z 
end 
*gather the coefficients (_b) and standard errors (_se) from the *regression each time 
simulate _b _se, reps(1000) seed (123): myreg 
* show the final result 
mat list r(table) 

* A possible solution with rclass 
* To understand the difference between rclass and eclass, see the Stata manual(http://www.stata.com/manuals13/rstoredresults.pdf) 

capture program drop myreg 
program define myreg, rclass 
drop _all 

set obs 200 
gen x= 2*uniform() 
gen z = rnormal(0,1) 
gen e = (invnorm(uniform()))^2 
qui sum e 
replace e=e-r(mean) 
gen y = 1 + 1*x +1*z + 1*e 
reg y x z 

mat output=e(b) 
return scalar b0=output[1,3] 
return scalar b1=output[1,1] 
return scalar b2=output[1,2] 
end 
simulate b_0=r(b0) b_1=r(b1) b_2=r(b2), rep(1000) seed (123): myreg 
return list 

* P.S. Вы должны прочитать все комментарии, предложенные @Nick, чтобы полностью понять, что я здесь сделал. ,

+0

Метрики: Это полезно. Я оставляю свои комментарии на месте на данный момент, потому что они объясняют некоторые из того, что не так с кодом OP. В лимитах плакаты могут не многому научиться, если вы напишите для них программу. Вы можете скопировать любой из моих комментариев в свой ответ; Я удалю все скопированные. –

+0

Ник: Я не думаю, что вам нужно удалить ваши комментарии. Это действительные комментарии и должны быть полезны для ОП. – Metrics

+0

Спасибо, но они подойдут или лучше интегрируются в ваш ответ. Если вы хотите добавить больше комментариев, которые будут еще лучше. Я обеспокоен тем, что эти потоки больше, чем кто-то, кто получает личную помощь публично. Чтобы быть полезными для кого-либо еще, объяснения полезны. –