分类暴露变量线性回归结果导出问题求助
解决分类暴露变量线性回归结果仅输出第一组的问题
你的问题出在只提取了回归结果矩阵的第一列,而分类变量(比如rep78)生成的多个哑变量对应矩阵的不同列。下面我会帮你修改代码,让它能输出所有分类水平的回归结果:
问题根源分析
原代码中local beta = table[1,1]这类语句固定取矩阵的第1列,而当你用i.rep78时,Stata会生成4个哑变量(对应rep78的2-5水平,以1为参照),每个哑变量的结果对应r(table)矩阵的第2到第5列(第1列是截距项)。所以你需要循环遍历矩阵的每一列,把每个哑变量的结果都写入到临时文件中。
修改后的完整代码
* 针对分类暴露变量的修正版代码 sysuse auto.dta, clear describe summ postfile temp str40 exp str40 outcome str40 adjusted N beta se lci uci pval using /// "\test.dta", replace foreach out in price weight { foreach exp_var in rep78 { // 直接用变量名,后续用i.前缀处理分类逻辑 foreach adjust in 1 { if `adjust'==1 local adjusted_vars "mpg" // 用i.前缀生成分类变量哑变量,替代xi命令(更现代的Stata写法) reg `out' i.`exp_var' `adjusted_vars' local N = e(N) matrix table = r(table) local cols = colsof(table) // 获取结果矩阵的总列数 // 循环遍历每一列,跳过截距项(第1列),处理所有分类哑变量 forvalues j=2/`cols' { // 获取当前列对应的哑变量名称(比如rep78_2、rep78_3等) local varname: colnames table[,`j'] // 提取该哑变量的回归结果 local beta = table[1,`j'] local se = table[2,`j'] local lci = table[5,`j'] local uci = table[6,`j'] local pval = table[4,`j'] // 将结果写入临时文件 post temp ("`varname'") ("`out'") ("`adjusted_vars'") (`N') /// (`beta') (`se') (`lci') (`uci') (`pval') } } } } postclose temp use "\test.dta", clear export excel using "\test.xlsx", firstrow(variables)
关键修改点说明
- 变量名优化:把
foreach exp in i.rep78改成foreach exp_var in rep78,后续用i.前缀在回归中生成哑变量,这样更容易提取每个哑变量的具体名称。 - 矩阵列循环:用
colsof(table)获取结果矩阵的总列数,从第2列开始循环(跳过第1列的截距项),确保每个分类水平的结果都被提取。 - 哑变量名称提取:通过
local varname: colnames table[,j']获取当前列对应的变量名,让输出的exp列能清晰显示具体的分类水平对比(比如rep78_2`代表rep78=2 vs 参照组rep78=1)。 - 语法现代化:用
i.前缀替代xi:命令,这是现代Stata推荐的分类变量处理方式,语法更简洁且兼容性更好。
修改后,rep78变量的4个哑变量结果都会被写入Excel,每个水平对应一行数据。
内容的提问来源于stack exchange,提问作者aelhak
相关产品推荐
相关产品推荐

