que - Alineación del marco de datos con valores perdidos
que es data frame en arcgis (3)
En realidad, hay tres soluciones aquí:
- pad
NA
a los valores ajustados nosotros mismos; - use
predict()
para calcular los valores ajustados; - soltar casos incompletos y pasar solo casos completos a
lm()
.
Opción 1
## row indicator with `NA`
id <- attr(na.omit(dat), "na.action")
fitted <- rep(NA, nrow(dat))
fitted[-id] <- model$fitted
nrow(dat)
# 2843
length(fitted)
# 2843
sum(!is.na(fitted))
# 2745
opcion 2
## the default NA action for "predict.lm" is "na.pass"
pred <- predict(model, newdata = dat) ## has to use "newdata = dat" here!
nrow(dat)
# 2843
length(pred)
# 2843
sum(!is.na(pred))
# 2745
Opción 3
Alternativamente, puede simplemente pasar un marco de datos sin ningún NA
a lm()
:
complete.dat <- na.omit(dat)
fit <- lm(death ~ diag + age, data = complete.dat)
nrow(complete.dat)
# 2745
length(fit$fitted)
# 2745
sum(!is.na(fit$fitted))
# 2745
En resumen,
- La opción 1 hace la "alineación" de una manera directa rellenando
NA
, pero creo que las personas rara vez adoptan este enfoque; - La opción 2 es realmente simple, pero es más costosa desde el punto de vista computacional;
- La opción 3 es mi favorita ya que mantiene todo simple.
Estoy usando un marco de datos con muchos valores de NA
. Si bien puedo crear un modelo lineal, posteriormente no puedo alinear los valores ajustados del modelo con los datos originales debido a los valores faltantes y la falta de columna del indicador.
Aquí hay un ejemplo reproducible:
library(MASS)
dat <- Aids2
# Add NA''s
dat[floor(runif(100, min = 1, max = nrow(dat))),3] <- NA
# Create a model
model <- lm(death ~ diag + age, data = dat)
# Different Values
length(fitted.values(model))
# 2745
nrow(dat)
# 2843
Mi respuesta es una extensión de la solución @ithomps:
for(i in 1:nrow(data)){
data$fitted.values.men[i]<- ifelse(data$sex == 1,
fit.males$fitted.values[paste(i)], "NA")
data$fitted.values.women[i]<- ifelse(data$sex == 0,
fit.females$fitted.values[paste(i)], "NA")
data$fitted.values.combined[i]<- fit.combo$fitted.values[paste(i)]
}
Porque en mi caso ejecuté tres modelos: 1 para hombres, 1 para mujeres y 1 para el combinado. Y para hacer las cosas "más" convenientes: los hombres y las mujeres se distribuyen aleatoriamente en mis data
. Además, tendré datos faltantes como entrada para lm()
, así que fit <- lm(y~x, data = data, na.action = na.exclude)
para obtener NA en mi modelo-objeto ( fit
) .
Espero que esto ayude a otros.
(Me resultó bastante difícil formular mi problema / pregunta, ¡me alegro de haber encontrado esta publicación!)
Yo uso un simple for loop. Los valores ajustados tienen un atributo (nombre) de la fila original a la que pertenecían. Por lo tanto:
for(i in 1:nrow(data)){
data$fitted.values[i]<-
fit$fitted.values[paste(i)]
}
"datos" es su marco de datos original. Fit es el objeto del modelo (es decir, ajuste <- lm (y ~ x, data = data))