使 vcov() 从 R 中的 lm() 对象接受 "sigma"

Making vcov() accept "sigma" from an lm() object in R

R 中的

vcov() 得到一个 lm() 对象和 returns 方差-协方差矩阵仅适用于 Interceptcoefficients (即 一个 2 x 2 矩阵).

不过我想知道,我怎样才能让 vcov() 也添加 sigma(即 summary(lm.object)$sigma) 到它的操作中(即生成 a 3 x 3 矩阵)?

例如,如果我们有m作为我们的lm对象(下面),我们如何vcov()计算方差- Interceptcoefficients 以及 sigma 来自 m?[= 的协方差矩阵27=]

q <- data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3)
m <- lm(bob ~ jen, q)

这是我尝试过但没有成功的方法:

vcov(c(m, summary(m)$sigma))

标准做法是只计算指定均值的参数的标准误差,而不计算指定方差的参数的标准误差。 lm 函数和 glm 函数都不会计算您要求的数量。

如果你真的想要这个信息,那么你必须自己推导它:根据回归系数和 sigma 编写 log-likelihood,然后计算这个函数的 Hessian 负值,评估在最大似然估计。反转此矩阵以获得所需的结果。

原来答案是block diagonal,一block是回归系数,一block是sigmasigma 的条目是 sigma^2 / (2 * n),其中 n 是样本大小。

示例:

q <- data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3)
m <- lm(bob ~ jen, q)
p <- length(coef(m))
v <- matrix(0, p + 1, p + 1)
rownames(v) <- colnames(v) <- c(names(coef(m)), "sigma")
v[1:p, 1:p] <- vcov(m)
v[p + 1, p + 1] <- sigma(m)^2 / (2 * nobs(m))
v
#>             (Intercept)       jen      sigma
#> (Intercept)   0.1560284 0.0000000 0.00000000
#> jen           0.0000000 0.1659876 0.00000000
#> sigma         0.0000000 0.0000000 0.07801418