使 vcov() 从 R 中的 lm() 对象接受 "sigma"
Making vcov() accept "sigma" from an lm() object in R
R 中的 vcov()
得到一个 lm()
对象和 returns 方差-协方差矩阵仅适用于 Intercept
和 coefficients
(即 一个 2 x 2 矩阵).
不过我想知道,我怎样才能让 vcov()
也添加 sigma
(即 summary(lm.object)$sigma)
到它的操作中(即生成 a 3 x 3 矩阵)?
例如,如果我们有m
作为我们的lm
对象(下面),我们如何vcov()
计算方差- Intercept
、coefficients
以及 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是sigma
。 sigma
的条目是 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
vcov()
得到一个 lm()
对象和 returns 方差-协方差矩阵仅适用于 Intercept
和 coefficients
(即 一个 2 x 2 矩阵).
不过我想知道,我怎样才能让 vcov()
也添加 sigma
(即 summary(lm.object)$sigma)
到它的操作中(即生成 a 3 x 3 矩阵)?
例如,如果我们有m
作为我们的lm
对象(下面),我们如何vcov()
计算方差- Intercept
、coefficients
以及 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是sigma
。 sigma
的条目是 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