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

Stata中margins命令atmeans选项及at/over参数差异问询

关于Stata中margins命令的两个常见疑问解答

一、margins中atmeans选项的计算逻辑差异

你提到的两段mlogit+margins代码,核心差异在于是否使用atmeans选项,Stata的计算逻辑完全不同:

  • 带atmeans的情况:
    Stata会先将所有自变量调整到它们的“均值状态”:

    • 连续自变量:设置为样本算术均值;
    • 分类自变量(比如你代码里的i.indipvar1这类):按样本中各分类的比例加权(也就是把指示变量的均值作为权重)。
      之后在这个统一的“均值点”上计算针对outcome(0)的预测概率,本质是单一均值点的预测值。
  • 不带atmeans的默认情况:
    Stata会遍历数据中的每一个观测,用该观测自身的自变量取值计算outcome(0)的预测概率,最后对所有观测的预测结果取算术平均,得到的是所有观测预测概率的平均值(即平均预测值)。

这两种逻辑针对的场景不同:atmeans适合看“当所有变量处于平均水平时的预测概率”,而默认行为适合看“样本整体的平均预测概率”,结果自然会有差异。

二、margins中at(year=(...))与over(year)的差异

你用year分类变量测试的两段代码,核心区别在于分组/赋值的逻辑:

  • margins cluster, at(cluster==0) at(year=(71 81 91 2001)):
    这个命令是强制修改整个样本的变量取值:把所有观测的cluster设为0,然后依次把所有观测的year设为71、81、91、2001,每次修改后计算所有观测的预测值并取平均。简单说就是:假设所有样本都属于某一年份(比如71年),同时cluster为0时,整个样本的平均预测值。

  • margins cluster, at(cluster==0) over(year):
    这个命令是按year对样本分组:先把数据拆分成year=71、year=81等四个子样本,然后在每个子样本内部,把cluster设为0,计算该子样本内所有观测的预测值并取平均。也就是只利用对应年份的观测数据,计算该年份下cluster=0的平均预测值。

两者结果不同的原因很直观:不同年份的子样本中,其他自变量的分布可能差异很大,前者是用全样本数据强制替换year值,后者是用各年份的子样本数据计算,自然会得到不同的结果。


内容的提问来源于stack exchange,提问作者ggg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:36:54