我已经包含了一个玩具示例来重新创建我的错误:
data(cars)
cars$dist[cars$dist<5]<-NA
cars$fast<- (cars$speed>10)*1
fit<-lm(speed~dist,cars)
cl <- function(dat,fm, cluster){
require(sandwich, quietly = TRUE)
require(lmtest, quietly = TRUE)
M <- length(unique(cluster))
N <- length(cluster)
K <- fm$rank
dfc <- (M/(M-1))*((N-1)/(N-K))
uj <- apply(estfun(fm),2, function(x) tapply(x, cluster, sum));
vcovCL <- dfc*sandwich(fm, meat=crossprod(uj)/N)
result<-coeftest(fm, vcovCL)
return(result)}
cl(cars,fit,cars$fast)
Error in tapply(x, cluster, sum) : arguments must have same length
问题是原始数据帧大于回归中使用的数据帧,因为删除了NA和子集回归。我需要计算健壮的标准错误,因此我必须使用函数cl计算SE,但是如何识别已移除的NA并适当地进行子集,以便我可以识别与数据帧一起使用的正确集群。
提前致谢。
答案 0 :(得分:2)
您可以使用complete.cases
来识别数据中的NA,但在这种情况下,最好使用lm
对象中的信息处理NA的方式(感谢@Dwin指出更好的方式来访问这些信息,更一般地说,如何简化这个答案)。
data(cars)
cars$dist
cars$dist[cars$dist < 5] <- NA
cars$fast<- (cars$speed > 10) * 1
which(!complete.cases(cars))
## [1] 1 3
fit <- lm(speed ~ dist, data = cars)
fit$na.action
## 1 3
## 1 3
## attr(,"class")
## [1] "omit"
因此,你的最终功能应该是这样的
cl <- function(fm, cluster){
require(sandwich, quietly = TRUE)
require(lmtest, quietly = TRUE)
M <- length(unique(cluster))
N <- length(cluster)
K <- fm$rank
dfc <- (M/(M-1))*((N-1)/(N-K))
uj <- apply(estfun(fm),2, function(x) tapply(x, cluster[-fm$na.action], sum));
vcovCL <- dfc*sandwich(fm, meat=crossprod(uj)/N)
result<-coeftest(fm, vcovCL)
result}
cl(fit,cars$fast)
## t test of coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.8424 2.9371 3.01 0.00422
## dist 0.1561 0.0426 3.67 0.00063