首页 文章

Stata:将单个数据集中的几个回归的系数/标准误差组合在一起(变量数量可能不同)

提问于
浏览
1

我已经问过question关于在单个数据集中存储几个回归的系数和标准误差 .

让我重申我最初问题的目标:

我想运行几个回归并将结果存储在我以后可用于分析的DTA文件中 . 我的约束是:我无法安装模块(我正在为其他人编写代码而不确定他们安装了哪些模块)一些回归量是因子变量 . 每个回归仅由因变量不同,因此我希望将其存储在最终数据集中,以跟踪系数/方差对应的回归 .

Roberto Ferrer建议的解决方案在我的测试数据上运行良好,但事实证明在其他类型的数据上不能很好地工作 . 原因是我的样本从一个回归到下一个回归略有变化,并且某个因子变量在每个回归中没有采用相同数量的值 . 这导致固定效果(使用 i.myvar 作为回归器动态创建)不具有相同的基数 .

假设我决定使用 i.year 来设置年固定效应(如:特定于年份的截距),但在一个回归中,2006年没有观察到 . 这意味着这个特定的回归将减少一个回归量(虚拟对应于year == 2006没有创建),因此存储了coeffs的较小矩阵 .

当尝试将矩阵堆叠在一起时,这导致一致性错误 .

我想知道是否有办法使初始解决方案对不同数量的回归量具有鲁棒性 . (也许将每个回归保存为dta,然后合并?)

我仍然受制于我不能依赖外部包的约束 .

1 回答

  • 2

    您可以遵循 append 数据集的策略,对您引用的问题中的代码进行细微更改:

    clear
    set more off
    
    save test.dta, emptyok replace
    
    foreach depvar in marriage divorce {
    
        // test data
        sysuse census, clear 
        generate constant = 1
        replace marriage = . if region == 4 
    
        // regression
        reg `depvar' popurban i.region constant, robust noconstant  // regressions
        matrix result_matrix = e(b)\vecdiag(e(V))                   // grab coeffs and their variances in a 2xK matrix
        matrix rownames result_matrix = `depvar'_b `depvar'_v       // add rownames to the two extra rows
    
        // get original column names of matrix
        local names : colfullnames result_matrix
    
        // get original row names of matrix (and row count)
        local rownames : rowfullnames result_matrix
        local c : word count `rownames'
    
        // make original names legal variable names
        local newnames
        foreach name of local names {
            local newnames `newnames' `=strtoname("`name'")'
        }
    
        // rename columns of matrix
        matrix colnames result_matrix = `newnames'
    
        // from matrix to dataset
        clear
        svmat result_matrix, names(col)
    
        // add matrix row names to dataset
        gen rownames = ""
        forvalues i = 1/`c' {
            replace rownames = "`:word `i' of `rownames''" in `i'
        }
    
        // append
        append using "test.dta"
        save "test.dta", replace
    
    }
    
    // list
    order rownames
    list, noobs
    

    结果就是你想要的 . 但问题是每次循环时都会重新加载数据集;它会将数据加载到您估算的回归次数 .

    您可能需要查看 post 并检查是否可以管理更有效的解决方案 . statsby 也可以工作,但您需要找到一种重命名存储变量的智能方法 .

相关问题