R在回归之前和之后匹配数据帧,具有缺失值和子集回归

时间:2013-07-11 22:51:36

标签: r regression

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

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

提前致谢。

1 个答案:

答案 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