Stata &引用;“指定的变量太多”;预测跟随逻辑错误

Stata &引用;“指定的变量太多”;预测跟随逻辑错误,stata,predict,Stata,Predict,我有一组跨越几个国家的数据(公司年数)。对于每个国家,我使用前五年估计一个logit模型,然后使用该模型预测随后几年的概率。Iforeachloop覆盖各国,并forvaluesloop覆盖随后几年 前几个国家的情况良好(包括估计和预测),但第五个国家的第一次抽样预测失败: Country: United Kingdom Year: 1994 too many variables specified r(103); 该模型适用于1994年,并且有足够的数据预测概率。我的predict呼叫是:

我有一组跨越几个国家的数据(公司年数)。对于每个国家,我使用前五年估计一个
logit
模型,然后使用该模型预测随后几年的概率。I
foreach
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会测试每个观察结果是否符合条件。因此,从大数据集中选择一个小子集会带来相对较大的开销。您可以通过在中执行等效的
来加快速度,但这需要仔细编写代码。或者你可以扔掉你不想要的数据,然后重新读取。我的直觉是,我在第二个答案中的建议并不比你已经在做的慢。快速和慢速的会计应该总是包括程序员的时间来获得正确的代码。。。。