2013-07-11 50 views
0

后,我已经包括了玩具例如重建我的错误:[R匹配数据帧之前和缺失值的回归和子集回归

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,但是如何识别已删除的NAs以及适当的子集,以便我可以识别正确的集群以使用数据帧。

在此先感谢。

+0

我可以问问你为什么要在参数列表,因为'cl'功能不引用它拥有“逸”? –

+0

你是对的,我应该删除它。由于簇是一个可以与回归中使用的数据帧匹配的向量。 – mumpy

回答

2

您可以使用complete.cases来indentify在NAS中的数据,但在这种情况下,将更好地使用这些信息在你的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 
+0

您可以使用'cluster [complete.cases(dat)]',而不是“双重否定”,但我的选择是使用'cluster [-fit $ na.action]'向量。 –

+0

@DWin这简化了很多东西,谢谢... – dickoa

+0

首先,感谢您的帮助!我意识到我在我的问题上犯了一个错误。我想失踪(NA)不是回归数据框较小的唯一来源。我的一些回归是子集回归。所以我提出的解决方案是使用相同的子集参数对原始数据集进行子集分类,然后执行回归?有没有更优雅的方式来做到这一点? – mumpy