Stata &引用;“指定的变量太多”;预测跟随逻辑错误
我有一组跨越几个国家的数据(公司年数)。对于每个国家,我使用前五年估计一个Stata &引用;“指定的变量太多”;预测跟随逻辑错误,stata,predict,Stata,Predict,我有一组跨越几个国家的数据(公司年数)。对于每个国家,我使用前五年估计一个logit模型,然后使用该模型预测随后几年的概率。Iforeachloop覆盖各国,并forvaluesloop覆盖随后几年 前几个国家的情况良好(包括估计和预测),但第五个国家的第一次抽样预测失败: Country: United Kingdom Year: 1994 too many variables specified r(103); 该模型适用于1994年,并且有足够的数据预测概率。我的predict呼叫是:
logit
模型,然后使用该模型预测随后几年的概率。Iforeach
loop覆盖各国,并forvalues
loop覆盖随后几年
前几个国家的情况良好(包括估计和预测),但第五个国家的第一次抽样预测失败:
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
更新:如果我
放弃(国家==“英国”)
,那么同样的问题会转移到美国(面板中的下一个和最后一个国家)。如果我删除列表(国家,“英国”,“美国”)
则问题消失,.do文件将运行 您正在使用国家名称作为predict
正在创建的新变量名称的一部分。然而,当你到了“英国”你的台词
predict temp_`c'`y'
意味着
predict temp_United Kingdom1812
但斯塔塔认为这是两个变量名,其中只有一个是允许的
否则,您将被一条简单的规则所困扰:Stata不允许变量名中包含空格
显然,同样的问题也会影响“美国”
最简单的错误是更改值,使空格变成下划线“\u1”。Stata可以使用包含下划线的变量名。那可能是
gen country2 = subinstr(country, " ", "_", .)
然后是循环country2
请注意,并非所有人都了解历史细节。1812年是英国军队烧毁白宫的一年。请随意替换“1776”或其他日期
(顺便说一句,这是一个非常清楚的问题!)这里有另一种解决问题的方法。初始化变量以保存预测值。然后,当您循环讨论各种可能性时,
用每组预测逐块替换它。这就避免了生成一系列不同名称的变量的整个过程,而这些变量是您不希望长期保留的
* 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
*根据Denis和Osobov(2008 JFE)生成表5
保存
一般付款人_应为=。
*按国家评估模型的循环
国家、地方(国家)的级别
当地国家的外汇储备{
显示“国家:`c'”
如果(国家==“'c'”,则汇总fyear,仅指
本地est_low=`r(min)'
本地est_高=`=`r(min)'+4'
本地pred_low=``r(min)'+5'
本地pred_high=`r(max)'
物流付款人尺寸v_a_tr e_a_tr re_be_tr///
如果(国家=“`c'”)///
&范围(fyear,'est_low','est_high')
FORY值=`pred_low'/`pred_high'{
显示“国家:`c'”
显示“年份:`y'”
预测温度///
如果(国家=“`c'”)///
&(fyear=='y'),pr
如果温度<,则悄悄更换付款人。
下降温度
}
}
生成增量=付款人-预期付款人
*桌子
表国家fyear///
内容(计数付款人平均付款人平均付款人预期)
*
恢复
谢谢你,尼克,你的回答非常清楚!我仍然不确定循环是否是我的净收益。:)我本应该预料到1812年的反应。在你的例子中,有一个一般性的讨论,从易懂的变量名称中有明显的好处,但除此之外,egen
的group()
函数允许一个干净的方法来循环一个由一个或更多变量定义的组。FWIW对于以后的读者,我更改了每个国家/地区的local宏
,而不是国家/地区变量:local c\u alt:subinstr local c”“”
。尼克,你为什么喜欢子指令?谢谢你的选择。我过去曾使用过这种方法,但最近由于其他地方按国家和年份进行回归的速度较慢(以及R小姐一次拆分、应用和合并的能力),我变得厌恶“如果”。我的厌恶在这里是没有根据的吗?最有可能的是,我怀疑
egen rowfirst`操作只是隐藏了重复的'if'调用。执行if
操作并不快,因为Stata会测试每个观察结果是否符合条件。因此,从大数据集中选择一个小子集会带来相对较大的开销。您可以通过在中执行等效的来加快速度,但这需要仔细编写代码。或者你可以扔掉你不想要的数据,然后重新读取。我的直觉是,我在第二个答案中的建议并不比你已经在做的慢。快速和慢速的会计应该总是包括程序员的时间来获得正确的代码。。。。