如何使用 delta 法计算边际效应的标准误?

机器算法验证 r 回归 标准错误 规模效应 增量法
2022-02-15 17:27:00

我有兴趣更好地理解用于逼近包含交互项的回归模型的平均边际效应的标准误差的 delta 方法。我在下面查看了相关问题但没有人提供我正在寻找的东西。

考虑以下示例数据作为激励示例:

set.seed(1)
x1 <- rnorm(100)
x2 <- rbinom(100,1,.5)
y <- x1 + x2 + x1*x2 + rnorm(100)
m <- lm(y ~ x1*x2)

我对 和 的平均边际效应 (AME)x1感兴趣x2要计算这些,我只需执行以下操作:

cf <- summary(m)$coef
me_x1 <- cf['x1',1] + cf['x1:x2',1]*x2 # MEs of x1 given x2
me_x2 <- cf['x2',1] + cf['x1:x2',1]*x1 # MEs of x2 given x1
mean(me_x1) # AME of x1
mean(me_x2) # AME of x2

但是如何使用 delta 方法来计算这些 AME 的标准误差?

我可以手动计算这种特定交互的 SE:

v <- vcov(m)
sqrt(v['x1','x1'] + (mean(x2)^2)*v['x1:x2','x1:x2'] + 2*mean(x2)*v['x1','x1:x2'])

但我不明白如何使用 delta 方法。

理想情况下,我正在寻找一些关于如何考虑(和编码)任意回归模型的 AME 的 delta 方法的指导。例如,这个问题提供了特定交互效果的 SE公式,Matt Golder 的这篇文档提供了各种交互模型的公式,但我想更好地理解计算 AME 的 SE 的一般程序,而不是公式任何特定 AME 的 SE。

1个回答

delta 方法简单地说,如果您可以表示一个辅助变量,您可以将其表示为正态分布随机变量的函数,该辅助变量近似正态分布,其方差对应于辅助变量相对于正态变量的变化量。(编辑:正如 Alecos Papadopoulos 所指出的,delta 方法可以更一般地表述,因此它不需要渐近正态性。)

最简单的方法是将其视为泰勒展开式,其中函数的第一项是均值,方差来自二阶项。具体来说,如果g是参数的函数βb是该参数的一致的、正态分布的估计量:

g(b)g(β)+g(β)(bβ)
自从β是一个常数,并且b是一致的估计量β,那么我们可以说:
n(g(b)g(β))DN(0,g(β)Σbg(β))
在这种情况下,b是您的 OLS 估计值,并且g是AME。您可以将此特定的 AME 编写为:
g(b1,b2)=b1+b2 mean(x2)
如果你取了这个函数的梯度(记住,系数的函数不是x2), 这将是:
[1,mean(x2)]
和方差-协方差矩阵b可能:
[s11s12s12s22]
将其代入方差公式并做一些矩阵代数会给您想要的相同表达式。

一般来说,如果你想这样做,你可以显式地编写任何代码g您希望将R其作为所有系数的函数,然后 numDeriv在您估计的参数处使用相对于您的参数的函数的数值梯度(否则您必须使用计算机代数)。然后你只需将方差-协方差矩阵和这个数值梯度代入公式,瞧!增量法。

附录:在这种特定情况下,R代码将是:

v <- vcov(m)

# Define function of coefficients. Note all coefficients are included so it 
# will match dimensions of regression coefficients, this could be done more 
# elegantly in principle
g <- function(b){
    return(b[2] + b[4] * mean(x2))
}

require(numDeriv) # Load numerical derivative package

grad_g <-  jacobian(g, m$coef) # Jacobian gives dimensions, otherwise same as
                               # gradient 

sqrt(grad_g%*% v %*% t(grad_g)) # Should be exactly the same 

请注意,对于这个问题,总是最好获得精确梯度而不是数值梯度,因为精确梯度的计算误差会更小。事实是gis linear 消除了这个问题,对于更复杂的函数,精确的梯度可能并不总是可用。