You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:26