2013-07-11 2 views
0

Я включил пример игрушки, чтобы воссоздать мою ошибку:R соответствие dataframe до и после регрессии с пропущенными значениями и подмножества регрессии

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 

Вопрос заключается в том, что оригинал dataframe больше, чем dataframe используется в regresssion из-за удаленной NA и подмножества регрессии. Мне нужно вычислить надежные стандартные ошибки, поэтому мне приходится вычислять SE с помощью функции cl, но как я могу определить удаленные NA и соответствующие подмножества, чтобы я мог идентифицировать правильный кластер, чтобы перейти с DataFrame.

Заранее спасибо.

+0

Могу ли я спросить, почему у вас есть «Дат» в списке аргументов, так как 'cl' функция не ссылаться на него? –

+0

Вы правы, я должен удалить это. Так как кластер - это вектор, который предположительно соответствует кадру данных, используемому в регрессии. – mumpy

ответ

2

Вы можете использовать complete.cases для indentify САМИХ в данных, но в данном случае это будет лучше использовать информацию в lm объекте на пути его перекачиваемым НС (Благодаря @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

Смежные вопросы