gpt4 book ai didi

r - 在predict.lm()中使用聚类协方差矩阵

转载 作者:行者123 更新时间:2023-12-04 07:12:12 24 4
gpt4 key购买 nike

我正在分析一个数据集,其中的数据聚集在几个组中(区域中的城镇)。数据集如下所示:

R> df <- data.frame(x = rnorm(10), 
y = 3*rnorm(x),
groups = factor(sample(c('0','1'), 10, TRUE)))
R> head(df)
x y groups
1 -0.8959 1.54 1
2 -0.1008 -2.73 1
3 0.4406 0.44 0
4 0.0683 1.62 1
5 -0.0037 -0.20 1
6 -0.8966 -2.34 0

我希望我的lm()估计值考虑到组内的类内相关性,为此,我正在使用函数 cl(),该函数接受 lm()并返回鲁棒的聚集协方差矩阵(原始 here):
cl  <- function(fm, cluster) {
library(sandwich)
M <- length(unique(cluster))
N <- length(cluster)
K <- fm$rank
dfc <- (M/(M-1))*((N-1)/(N-K-1))
uj <- apply(estfun(fm), 2, function(x) tapply(x, cluster, sum));
vcovCL <- dfc * sandwich(fm, meat = crossprod(uj)/N)
return(vcovCL)
}

现在,
output <- lm(y ~ x, data = df)
clcov <- cl(output, df$groups)
coeftest(output, clcov, nrow(df) - 1)

给我我所需的估计。现在的问题是,我想使用模型进行预测,并且需要使用新的协方差矩阵 clcov计算预测的标准误差。那就是我需要
predict(output, se.fit = TRUE)

但是使用 clcov而不是 vcov(output)。像 vcov() <-这样的东西将是完美的。

当然,我可以编写自己的函数来进行预测,但是我只是想知道是否有更实用的方法可以使用签名 lm的方法(例如arm::sim)。

最佳答案

预测中的拟合不是使用vcov矩阵计算的,而是使用qr分解和残差的。这也适用于vcov()函数:它从summary.lm()中获取未缩放的cov矩阵以及残差,并使用这些残差。再次,根据QR分解计算未缩放的cov矩阵。

因此,恐怕答案是“不,除了编写自己的函数,别无选择”。您无法真正设置vcov矩阵,因为需要时会重新计算它。但是,编写自己的函数相当简单。

predict.rob <- function(x,clcov,newdata){
if(missing(newdata)){ newdata <- x$model }
m.mat <- model.matrix(x$terms,data=newdata)
m.coef <- x$coef
fit <- as.vector(m.mat %*% x$coef)
se.fit <- sqrt(diag(m.mat%*%clcov%*%t(m.mat)))
return(list(fit=fit,se.fit=se.fit))
}

我没有使用predict()函数来避免不必要的计算。无论如何,它不会缩短太多代码。

另外,最好在 stats.stackexchange.com上问这样的问题

关于r - 在predict.lm()中使用聚类协方差矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3790116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com