2013-07-11 42 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