我有一个跨越几个国家的数据小组(公司年)。对于每个国家/地区,我估计使用前五年的logit
模型,然后我将此模型用于后续年份的predict
概率。我foreach
循环遍布各个国家/地区forvalues
循环过去几年。
前几个国家运作良好(包括估算和预测),但第五个国家的第一个样本外预测失败了:
Country: United Kingdom
Year: 1994
too many variables specified
r(103);
模型拟合,1994年有足够的数据来预测概率。我的predict
电话是:
predict temp_`c'`y' ///
if (country == "`c'") ///
& (fyear == `y'), ///
pr
您有什么想法会导致此错误吗?我感到困惑,因为logit
和predict
在同一个循环中的其他地方工作。谢谢!
FWIW,这是.do文件。
* generate table 5 from Denis and Osobov (2008 JFE)
preserve
* loop to estimate model by country
levelsof country, local(countries)
foreach c of local countries {
display "Country: `c'"
summarize fyear if (country == "`c'"), meanonly
local est_low = `r(min)'
local est_high = `=`r(min)' + 4'
local pred_low = `=`r(min)' + 5'
local pred_high = `r(max)'
logit payer size v_a_tr e_a_tr re_be_tr ///
if (country == "`c'") ///
& inrange(fyear, `est_low', `est_high')
forvalues y = `pred_low'/`pred_high' {
display "Country: `c'"
display "Year: `y'"
predict temp_`c'`y' ///
if (country == "`c'") ///
& (fyear == `y'), ///
pr
}
}
* combine fitted values and generate delta
egen payer_expected = rowfirst(temp_*)
drop temp_*
generate delta = payer - payer_expected
* table
table country fyear, ///
contents(count payer mean payer mean payer_expected)
*
restore
更新:如果我drop (country == "United Kingdom")
,则同样的问题会转移到美国(面板中的下一个和最后一个国家/地区)。如果我drop inlist(country, "United Kingdom", "United States")
那么问题就会消失并且.do文件会运行。
答案 0 :(得分:2)
您正在使用国家/地区名称作为predict
正在创建的新变量名称的一部分。但是,当你到达“英国”你的行
predict temp_`c'`y'
暗示类似
predict temp_United Kingdom1812
但Stata认为这是两个变量名,只允许一个。
否则,你被一个简单的规则所困扰:Stata不允许变量名中的空格。
显然,同样的问题会与“美国”相吻合。
最简单的软糖是更改值,以便空格成为下划线“_”。 Stata可以使用包括下划线在内的变量名称。那可能是
gen country2 = subinstr(country, " ", "_", .)
然后循环country2
。
请注意每个人的历史细节。 1812年是英国军队烧毁白宫的一年。随意替换“1776”或其他选择日期。
(顺便说一句,这是一个非常明确的问题!)
答案 1 :(得分:1)
这是解决问题的另一种方法。初始化变量以保存预测值。然后当你循环遍历各种可能性时,replace
它会按照每组预测的块进行分块。这避免了生成一堆具有不同名称的变量的全部业务,而这些变量是您不想长期保留的。
* generate table 5 from Denis and Osobov (2008 JFE)
preserve
gen payer_expected = .
* loop to estimate model by country
levelsof country, local(countries)
foreach c of local countries {
display "Country: `c'"
summarize fyear if (country == "`c'"), meanonly
local est_low = `r(min)'
local est_high = `=`r(min)' + 4'
local pred_low = `=`r(min)' + 5'
local pred_high = `r(max)'
logit payer size v_a_tr e_a_tr re_be_tr ///
if (country == "`c'") ///
& inrange(fyear, `est_low', `est_high')
forvalues y = `pred_low'/`pred_high' {
display "Country: `c'"
display "Year: `y'"
predict temp ///
if (country == "`c'") ///
& (fyear == `y'), pr
quietly replace payer_expected = temp if temp < .
drop temp
}
}
generate delta = payer - payer_expected
* table
table country fyear, ///
contents(count payer mean payer mean payer_expected)
*
restore