我已经问了一个关于在单个数据集中存储多个回归的系数和标准误差的问题。
让我重申一下我最初问题的目的:
我想运行几个回归和存储他们的结果在DTA文件,我可以稍后用于分析。我的约束条件是:
- 我不能安装模块(我正在为其他人编写代码,而不是确定他们安装了什么模块)
- 一些回归因子是因子变量。
- 每次回归的不同之处仅在于被依赖性变量,所以我想把它存储在最终的数据集中系数/方差对应的回归轨迹。
Roberto Ferrer建议的解决方案在我的测试数据上工作得很好,但在其他类型的数据上工作得不太好。原因是我的样本从一个回归到下一个回归略有变化,并且一些因素变量在每次回归中不取相同数量的值。这导致固定效果(使用i.myvar
作为回归量动态创建)不具有相同的基数。
假设我决定使用i.year
来放置年份固定效应(如:特定年份的截距),但在一个回归中没有2006年的观测值。这意味着这个特定的回归将减少一个回归量(不创建与year==2006相对应的dummy),因此存储系数的矩阵更小。
当试图将矩阵堆叠在一起时,这会导致一致性错误。
我想知道是否有一种方法可以使初始解决方案对不同数量的回归量具有鲁棒性。(也许将每个回归保存为数据,然后合并?)
我仍然受制于不能依赖外部包的约束。
您可以遵循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
也可以工作,但您需要找到一种聪明的方法来重命名存储的变量。