Me gustaría hacer una regresión de un vector B contra cada una de las columnas de una matriz A. Esto es trivial si no faltan datos, pero si la matriz A contiene valores faltantes, entonces mi regresión contra A está limitada a incluir solo filas donde todos los valores están presentes (el comportamiento predeterminado na.omit ). Esto produce resultados incorrectos para columnas sin datos faltantes. Puedo hacer una regresión de la matriz de columna B contra columnas individuales de la matriz A, pero tengo miles de regresiones que hacer, y esto es prohibitivamente lento y poco elegante. La función na.exclude parece estar diseñada para este caso, pero no puedo hacer que funcione. ¿Qué estoy haciendo mal aquí? Usando R 2.13 en OSX, si es importante.
A = matrix(1:20, nrow=10, ncol=2)
B = matrix(1:10, nrow=10, ncol=1)
dim(lm(A~B)$residuals)
# [1] 10 2 (the expected 10 residual values)
# Missing value in first column; now we have 9 residuals
A[1,1] = NA
dim(lm(A~B)$residuals)
#[1] 9 2 (the expected 9 residuals, given na.omit() is the default)
# Call lm with na.exclude; still have 9 residuals
dim(lm(A~B, na.action=na.exclude)$residuals)
#[1] 9 2 (was hoping to get a 10x2 matrix with a missing value here)
A.ex = na.exclude(A)
dim(lm(A.ex~B)$residuals)
# Throws an error because dim(A.ex)==9,2
#Error in model.frame.default(formula = A.ex ~ B, drop.unused.levels = TRUE) :
# variable lengths differ (found for 'B')
fuente
Respuestas:
Editar: no entendí tu pregunta. Hay dos aspectos:
a)
na.omit
yna.exclude
ambos eliminan en caso de caso tanto los predictores como los criterios. Solo difieren en que el extractor funciona comoresiduals()
ofitted()
rellenará su salida conNA
s para los casos omitidosna.exclude
, por lo que tiene una salida de la misma longitud que las variables de entrada.b) El problema real no es con esta diferencia entre
na.omit
yna.exclude
, no parece que desee la eliminación en caso de que tenga en cuenta las variables de criterio, lo que ambos hacen.lm()
haciendo algo similar a lo siguiente:lm()
fuente
Puedo pensar en dos formas. Una es combinar los datos usando
na.exclude
y luego separar los datos nuevamente:Otra forma es usar el
data
argumento y crear una fórmula.Si está haciendo mucha regresión, la primera forma debería ser más rápida, ya que se realiza menos magia de fondo. Aunque si solo necesita coeficientes y residuos, sugiero usar
lsfit
, que es mucho más rápido quelm
. La segunda forma es un poco mejor, pero en mi computadora portátil intentar hacer un resumen de la regresión resultante arroja un error. Trataré de ver si esto es un error.fuente
El siguiente ejemplo muestra cómo hacer predicciones y residuos que se ajustan al marco de datos original (usando la opción "na.action = na.exclude" en lm () para especificar que los NA deben colocarse en los vectores de residuos y predicción donde el marco de datos original tenía valores perdidos. También muestra cómo especificar si las predicciones deben incluir solo observaciones donde las variables explicativas y dependientes estaban completas (es decir, predicciones estrictamente en la muestra) u observaciones donde las variables explicativas estaban completas, y por lo tanto la predicción Xb es posible ( es decir, incluida la predicción fuera de la muestra para observaciones que tenían variables explicativas completas pero les faltaba la variable dependiente).
Utilizo cbind para agregar las variables predichas y residuales al conjunto de datos original.
fuente