将数据框与缺失值对齐

IJH*_*IJH 3 regression r linear-regression lm na

我正在使用具有许多NA值的数据框.虽然我能够创建一个线性模型,但由于缺少值和缺少指标列,我随后无法将模型的拟合值与原始数据对齐.

这是一个可重复的例子:

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
Run Code Online (Sandbox Code Playgroud)

李哲源*_*李哲源 7

这里实际上有三个解决方案:

  1. NA自己的价值观;
  2. 使用predict()来计算拟合值;
  3. 我们自己丢弃不完整的案例,只传递完整的案例lm().

选项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
Run Code Online (Sandbox Code Playgroud)

选项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
Run Code Online (Sandbox Code Playgroud)

选项3

或者,您可以简单地将数据框传递NAlm():

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
Run Code Online (Sandbox Code Playgroud)

综上所述,

  • 选项1通过填充以直接的方式进行"对齐" NA,但我认为人们很少采用这种方法;
  • 选项2非常简单,但计算成本更高;
  • 选项3是我的最爱,因为它保持所有事情的简单.