2011-07-30 12 views
8

Así que estoy teniendo algunos problemas con algunos NA valores en los residuos de una regresión de la sección transversal lm en R.¿Cómo trato las NA en los residuos en una regresión en R?

El problema no es la NA valores en sí, que es la forma R les presenta.

Por ejemplo:

test$residuals 
#   1   2   4   5 
# 0.2757677 -0.5772193 -5.3061303 4.5102816 
test$residuals[3] 
#  4 
# -5.30613 

En este sencillo ejemplo, un valor NA hará que uno de los residuos van a faltar. Cuando extraigo los residuos, puedo ver claramente que falta el tercer índice. Hasta aquí todo bien, no tengo quejas aquí. El problema es que el vector numérico correspondiente ahora es un elemento más corto, por lo que el tercer índice es en realidad el cuarto. ¿Cómo puedo hacer que R devuelva estos residuos en su lugar, es decir, que se muestre explícitamente NA en lugar de omitir un índice?

test$residuals 
#   1   2   3   4   5 
# 0.2757677 -0.5772193   NA -5.3061303 4.5102816 

Necesito hacer un seguimiento de todos los residuos individuales por lo que tendría mi vida mucho más fácil si les podía extraer de esta manera en su lugar.

Respuesta

11

Acabo de encontrar this buscando un poco más profundo. La función resid en un lm con na.action=na.exclude es el camino a seguir.

1

Aquí una estrategia ilustrada usando un ejemplo ligeramente modificado en la página de ayuda de lm. Esta es una aplicación directa de la definición de residuo:

## Annette Dobson (1990) "An Introduction to Generalized Linear Models". 
## Page 9: Plant Weight Data. 
# Two NA's introduced 
weight <- c(4.17,5.58,NA,6.11,4.50,4.61,5.17,4.53,5.33,5.14, 
4.81,4.17,4.41,3.59,5.87,3.83,6.03,NA,4.32,4.69) 
group <- gl(2,10,20, labels=c("Ctl","Trt")) 
lm.D9 <- lm(weight ~ group) 
rr2 <- weight- predict(lm.D9, na.action=na.pass) 
Warning message: 
In weight - predict(lm.D9, na.action = na.pass) : 
    longer object length is not a multiple of shorter object length 
> rr2 
[1] -0.8455556 0.5644444   NA 1.0944444 -0.5155556 -0.4055556 0.1544444 
[8] -0.4855556 0.3144444 0.5044444 0.1744444 -0.4655556 -0.2255556 -1.0455556 
[15] 1.2344444 -0.8055556 1.3944444   NA -0.6955556 -0.3255556 

creo que sería peligroso para modificar directamente un objeto lm para que lm.D9 $ residual regresaría ese resultado.

3

Otra idea más es aprovechar los nombres de fila asociados con la trama de datos proporcionada como entrada a lm. En ese caso, los residuos deben conservar los nombres de los datos de origen. El acceso a los residuos de su ejemplo daría un valor de -5.3061303 para test$residuals["4"] y NA para test$residuals["3"].

Sin embargo, esto no responde exactamente a su pregunta. Un enfoque para hacer exactamente lo que solicitó en términos de conseguir los valores de NA de nuevo en los residuales se ilustra a continuación:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA) 
> Z<-lm(y~x,data=D) 
> D[names(Z$residuals),"residual"]<-Z$residuals 
> D 
    x y residual 
1 NA 2.1  NA 
2 2 3.2 -0.28 
3 3 4.9  0.55 
4 4 5.0 -0.22 
5 5 6.0 -0.09 
6 6 7.0  0.04 

Si usted está haciendo predicciones basadas en los resultados de la regresión, es posible que desee especificar na.action=na.exclude en lm . Vea los resultados de la ayuda para na.omit para una discusión. Tenga en cuenta que simplemente especificando na.exclude en realidad no vuelve a poner los valores NA en el vector de residuos.

Como se señaló en una respuesta anterior, resid (sinónimo de residuals) proporciona una función de acceso genérico en el que los residuos contendrán valora la NA deseado si na.exclude se especificó en lm. El uso de resid es probablemente más general y un enfoque más limpio. En ese caso, el código del ejemplo anterior se cambiaría a:

> D<-data.frame(x=c(NA,2,3,4,5,6),y=c(2.1,3.2,4.9,5,6,7),residual=NA) 
> Z<-lm(y~x,data=D,na.action=na.exclude) 
> D$residuals<-residuals(Z) 
Cuestiones relacionadas