0

我已经包含了一个玩具示例来重新创建我的错误:

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 和适当的子集,以便我可以识别与数据帧一起使用的正确集群。

提前致谢。

4

1 回答 1

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
于 2013-07-11T23:13:51.030 回答