Stata中如何对样本外数据集的特定子组生成margins式预测
在新数据集中还原混合效应Logistic模型的
margins x1结果 问题核心
你遇到的两个关键问题:
- 新数据执行
margins x1报错,是因为切换数据集后,Stata丢失了原估计样本的e(sample)标记,margins默认会检查这个标记 - 直接计算新数据中x1分组的预测概率均值和原
margins结果不符,是因为两者的计算逻辑完全不同:margins x1是固定其他协变量(x2)在原估计样本的均值/参考水平,单独计算x1取不同值时的预测概率- 而直接求分组均值,是基于新数据中x2的实际分布,对该组所有观测的预测概率取平均
解决方案1:直接用margins命令(推荐)
步骤1:确保模型结果可调用
如果切换数据集前没保存模型,先在原数据集执行:
estimates save "my_melogit_model.ster", replace
然后加载新数据后,导入模型:
use "C:\file path\newdata.dta", clear estimates use "my_melogit_model.ster"
步骤2:执行带参数的margins命令
margins x1, atmeans noestimcheck reffects(0)
参数说明:
atmeans:强制其他协变量取原估计样本的均值(分类变量取参考水平),和原margins x1的计算逻辑完全一致noestimcheck:跳过Stata对e(sample)的检查,解决报错问题reffects(0):固定随机效应为0(样本外预测时,新数据的x3可能不在原随机效应分组中,这是常规做法;如果需要保留随机效应,可去掉该参数,但需确保新数据的x3和原数据的分组一致)
执行后输出的结果就和原数据集的margins x1完全匹配。
解决方案2:手动构建基准观测计算
如果不想用margins,可以手动模拟margins的计算逻辑:
步骤1:在原数据集提取协变量基准值
* 提取x2的均值(如果x2是分类变量,取其参考水平,比如0) summarize x2 if e(sample), meanonly scalar x2_base = r(mean) * 保存标量到文件 scalar save "covariate_bases.ster", replace(x2_base)
步骤2:在新数据集中计算基准预测概率
use "C:\file path\newdata.dta", clear * 导入基准标量 scalar load "covariate_bases.ster" * 添加两个虚拟观测,分别对应x1=0和x1=1,x2取基准值 set obs `=_N + 2' local last1 = _N - 1 local last2 = _N replace x1 = 0 in `last1' replace x1 = 1 in `last2' replace x2 = x2_base in `last1'/`last2' * x3可设为任意值(如果用reffects(0),随机效应不影响结果) * 计算预测概率,固定随机效应为0 predict margin_prob if inlist(_n, `last1', `last2'), reffects(0) * 查看结果 list x1 x2 margin_prob if inlist(_n, `last1', `last2')
得到的margin_prob就是和原margins x1一致的结果。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

