2016-07-07 139 views
3

我正在使用一个数据帧,其中包含许多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 

回答

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 

选项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 

选项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 

综上所述,

  • 选项1通过填充NA做以简单的方式 “对齐”,但我认为人们很少采取这种方式;
  • 选项2非常简单,但它在计算上花费更大;
  • 选项3是我最喜欢的,因为它使所有的事情变得简单。
+0

嗯,其实最简单的办法是把'na.action = na.exclude'在'lm'。 –

2

我使用一个简单的for循环。拟合的值具有它们所属的原始行的属性(名称)。因此:

for(i in 1:nrow(data)){ 
    data$fitted.values[i]<- 
    fit$fitted.values[paste(i)] 
} 

“数据”是您的原始数据框。飞度是从模型对象(即适合< - 流明(Y〜X,数据=数据))

0

我的回答是一个扩展@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)] 
} 

因为在我的情况下,我跑了三种模式:男性1人,女性1人,综合人数1人。为了让事情更“方便”:男性和女性随机分布在我的data中。此外,我将缺少数据作为lm()的输入,所以我做了fit <- lm(y~x, data = data, na.action = na.exclude)以在我的模型对象(fit)中获得NAs。

希望这可以帮助别人。

(我发现它非常难以配制我的问题/问题,很高兴我发现这个职位!)