tabla que presentacion mapas herramientas definicion data contenido barra r regression linear-regression na lm

que - Alineación del marco de datos con valores perdidos



que es data frame en arcgis (3)

En realidad, hay tres soluciones aquí:

  1. pad NA a los valores ajustados nosotros mismos;
  2. use predict() para calcular los valores ajustados;
  3. 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))