“指定了太多变量”错误,预测后续logit

时间:2013-02-12 11:24:06

标签: stata predict

我有一个跨越几个国家的数据小组(公司年)。对于每个国家/地区,我估计使用前五年的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

您有什么想法会导致此错误吗?我感到困惑,因为logitpredict在同一个循环中的其他地方工作。谢谢!

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文件会运行。

2 个答案:

答案 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