使vcov()接受;西格玛;来自R中的lm()对象

使vcov()接受;西格玛;来自R中的lm()对象,r,function,regression,linear-regression,lm,R,Function,Regression,Linear Regression,Lm,R中的vcov()获取一个lm()对象,并仅返回截距和系数的方差协方差矩阵(即,一个2 x 2矩阵) 但是我想知道,我如何使vcov()也将sigma(即summary(lm.object)$sigma)添加到其操作中(即生成一个3 x 3矩阵) 例如,如果我们将m作为lm对象(如下),我们如何使vcov()计算截距,系数的方差协方差矩阵,以及m的西格玛 q <- data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3)

R中的
vcov()
获取一个
lm()
对象,并仅返回
截距
系数
的方差协方差矩阵(即,一个2 x 2矩阵)

但是我想知道,我如何使
vcov()
也将
sigma
(即
summary(lm.object)$sigma)
添加到其操作中(即生成一个3 x 3矩阵)

例如,如果我们将
m
作为
lm
对象(如下),我们如何使
vcov()
计算
截距
系数
的方差协方差矩阵,以及
m
西格玛

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)

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

如果你真的想要这些信息,那么你必须自己推导出来:用回归系数和sigma写下对数似然,然后计算这个函数的Hessian的负值,在最大似然估计下进行评估。反转此矩阵以获得所需结果

结果表明,答案是块对角的,一个块表示回归系数,一个块表示
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
q
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