Stata中margins命令atmeans选项及at/over参数差异问询
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

