如何开展边际效应分析?

type
status
date
slug
summary
tags
category
icon
password
网址
作者
标签
文章链接
发布时间
来源
在 Stata 中进行边际效应(Marginal Effects)分析是理解非线性模型(如 Logit, Probit, Poisson 等)或包含交互项的线性模型结果的关键步骤。由于这些模型的系数通常不直接表示自变量对因变量的边际影响,因此需要计算边际效应来获得更直观和可解释的结果。
Stata 中主要使用 margins 命令来执行边际效应分析。这个命令非常强大和灵活,可以计算:
  • 预测边际 (Predictive Margins):在特定协变量值下,因变量的预测值。
  • 边际效应 (Marginal Effects):自变量单位变化对因变量预测值的平均影响。
  • 边际效应图 (Marginsplot):将边际效应可视化。

为什么需要边际效应?

在像 Logit 或 Probit 这样的非线性模型中,回归系数表示的是对线性预测器(或对数几率)的影响,而不是对概率本身的直接影响。因变量的概率是一个非线性函数(例如,Logit 模型的 S 形曲线),这意味着自变量的单位变化对因变量概率的影响会随着自变量取值的不同而变化。
边际效应解决了这个问题,它计算了:
  • 对于连续变量:当所有其他变量保持不变时,该变量微小变化对因变量预测值的瞬时变化率(导数)。
  • 对于分类变量(虚拟变量):当所有其他变量保持不变时,从一个类别到另一个类别的变化对因变量预测值的离散变化。

margins 命令的基本用法

margins 命令必须在运行回归模型之后使用。
基本语法:
第一步:(your regression command)
第二步:margins [marginlist] [if] [in] [weight] [, response_options options]
  • dydx(varlist) 估计变量的边际效应
  • eyex(varlist) 估计变量的弹性
  • dyex(varlist) 估计变量的半弹性(d(y)/d(lnx))
  • eydx(varlist) 估计变量的半弹性(d(lny)/d(x))。

常见的边际效应类型

在 Stata 中,计算边际效应通常有三种主要方式:
  1. 平均边际效应 (Average Marginal Effects - AME)
      • 这是最常用且通常推荐的选项。它计算的是每个观测值的边际效应,然后对这些边际效应进行平均。这提供了一个在整个样本中平均而言的效应。
      • 命令示例:
        • 所有变量的平均边际效应:
          • margins, dydx(*)
            dydx(*) 选项表示计算所有自变量的 dy/dx(即边际效应)。
        • 特定变量的平均边际效应:
          • margins, dydx(explanatory_var1)
  1. 在均值处的边际效应 (Marginal Effects at Means - MEM)
      • 这种方法是在所有协变量都取其平均值(或模式值,对于分类变量)的情况下计算边际效应。
      • 虽然在直观上可能容易理解,但如果变量的均值不具有实际意义(例如,一个二元变量的均值是0.5),或者模型存在交互项,那么 MEM 的解释可能不那么直接或具有代表性。
      • 命令示例:margins, dydx(explanatory_var1) atmeans,其中atmeans 选项告诉 Stata 在所有变量的均值处计算边际效应。
  1. 在特定值处的边际效应 (Marginal Effects at Representative Values - MER)
      • 这允许你在自变量的特定或有意义的取值处计算边际效应。这对于理解在不同情境下的效应如何变化非常有用,尤其是在模型包含交互项时。
      • 命令示例:
        • explanatory_var3 的特定值(例如10、20、30)下计算 explanatory_var1 的边际效应:
          • margins, dydx(explanatory_var1) at(explanatory_var3=(10 20 30))
            如果explanatory_var3 是分类变量,也可以使用:
            margins, dydx(explanatory_var1) over(explanatory_var3)
        • 计算分类变量(例如 i.gender)在不同 age 值下的预测概率:
          • margins gender, at(age=(20(10)60)),这里 gender 是一个虚拟变量,at(age=(20(10)60)) 表示从20岁到60岁,每隔10岁计算一次预测概率。

结合交互项的边际效应分析

当你的模型包含交互项时,边际效应的分析变得尤为重要。因为一个变量的效果现在取决于另一个(或多个)变量的取值。
例如,如果你有模型:logit outcome_var i.cat_var##c.cont_var (其中 cat_var 是分类变量,cont_var 是连续变量)。
  • 计算 cont_varcat_var 不同水平下的边际效应:
    • margins cat_var, dydx(cont_var)
      这将显示连续变量 cont_varoutcome_var 的边际效应,分别在 cat_var 的每个类别下。
  • 计算 cat_varcont_var 不同取值下的边际效应(离散变化):
    • margins cont_var, dydx(cat_var)
      这将显示分类变量 cat_var 从一个类别到另一个类别的变化对 outcome_var 的边际效应,分别在 cont_var 的特定取值下(通常是平均值)。
      举例
      (1)reg price c.length i.foreign c.turn c.length#i.foreign c.length#c.turn i.foreign#c.turn c.length#i.foreign#c.turn
      在回归时指定变量是连续变量还是虚拟变量,分别使用c.i.来标记。
      (2)margins i.foreign, dydx(length) atmeans
      margins后指定哪个(或哪些)变量是虚拟变量,dydx()里放入自变量,atmeans表示其他连续变量取均值。
      注意:如果不指定虚拟变量,而是写成margins, dydx(length) atmeans,Stata会把所有变量都当成连续变量来处理,其中虚拟变量也取平均值。
  • 绘制交互效应图 (marginsplot): 在运行 margins 命令后,你可以直接使用 marginsplot 命令来绘制结果。这对于可视化交互效应非常有效。
    • margins cat_var, at(cont_var=(min(cont_var) max(cont_var))) // 或其他有意义的值 marginsplot
      或者:
      margins, at(cont_var=(min(cont_var) max(cont_var))) at(cat_var=(0 1)) // 假设cat_var是二元的 marginsplot, x(cont_var) recast(line) connect(cat_var)

解释边际效应结果

  • 对于连续变量的边际效应 (dydx): 如果 dydx 报告为 0.05,表示当其他变量保持不变时,该自变量每增加一个单位,因变量的预测概率(或其他预测值)平均增加 0.05 个百分点。
  • 对于分类变量的边际效应 (dydx): 如果 dydx 报告为 0.10,且你的分类变量是从0变为1(例如,女性 vs 男性),这意味着女性比男性平均而言有高出 0.10 的概率(或预测值)。
  • margins 报告的 Margin: 这是在特定条件下因变量的预测值(例如,预测概率)。例如,如果你对 i.gender 运行 margins,它会告诉你男性和女性的平均预测概率分别是多少。

举例:logit回归

首先,我们先做个logit回归:
输出:

计算边际效应

此外,在求边际效应时,我们可以使用at()选项,指定在某种特定情况下,如指定协变量特定值来求解边际效应。比如
margins, dydx(smoke) at(age=20)  //在age等于20时求smoke的边际效应
输出:
over(varlist) 则计算在varlist每一值的情况下求解边际效应。如:
margins, dydx(smoke) over(race) //在race的每一值下求smoke的边际效应
输出:
可以使用命令 margins, dydx(*) 来求上面logit回归的所有变量的边际效应并将边际效应结果输出。
输出:

结果导出

导出单个模型结果

如果我们想要将边际效应结果输出到Word中,我们需要使用estpost命令。我们可以输出边际效应结果的系数、t值。
输出:
notion image

导出多个模型结果

上面只输出了一个边际效应结果,但在实际中我们也许会想将多个边际效应结果放在一个表格里。此时,我们需要结合eststo命令。
输出:
notion image
 

特殊举例:面板负二项回归模型

在 Stata 中使用 xtnbreg(用于面板数据的负二项回归)后,使用 margins 命令进行边际效应分析,但要注意以下几点:

基本步骤

  1. 运行 xtnbreg 回归
    1. xtnbreg y x1 x2 x3, fextnbreg y x1 x2 x3, re
      说明:你可以选择固定效应(fe)或随机效应(re)。

  1. 运行 margins 命令
Stata 的 marginsxtnbreg 配合时,有一些限制(尤其是固定效应下)。通常推荐用随机效应模型(re),因为 femargins 往往会报错。

示例:预测变量的边际效应(平均边际效应)

margins, dydx(*) predict(nu0)
  • dydx(*) 表示对所有解释变量求边际效应
  • predict(nu0)xtnbreg 的一个选项,表示预测 条件均值(conditional mean)
在协变量取均值时的边际效应:
margins, dydx(*) atmeans predict(nu0)

如果只想看某个变量的边际效应:

margins, dydx(x1) predict(nu0)

建议与注意事项:

  • 对于 xtnbreg, femargins 有时不支持,因为固定效应估计是用条件极大似然(CML),不能得到完整的预测概率。
  • 如果你坚持使用固定效应,可以考虑估计 marginal effects 的近似值,或切换为随机效应模型进行 margins 分析。

画出边际效应图(可选)

如果你希望边际效应可视化:
margins, dydx(x1) predict(nu0)
marginsplot

交互项:

xtnbreg y c.x1##c.x2 x3, re
margins, dydx(x1) at(x2=(1 2 3)) predict(nu0)

参考资料

 
P.S. Odd ratio与marginal effect的区别:
 
Prev
Stata18的绘图风格变化
Next
local和global的使用区别
Loading...
Article List
Practice makes perfect
文献集锦
如何理论创新?
管理学理论集锦
Python实际应用
聚类标准误与固定效应
巫师3:狂猎
Stata应用技巧
Python知识与技巧
双重差分法(DID)
创新文献阅读与摘要
计量经济学
Python绘图相关