2016-07-07 12 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

ありされ、実際にここに3ソリューション:

  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

、単に任意012なしでデータフレームを通過するかもしれません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 

  • オプション1NAをパディングすることにより、簡単な方法で「アライメント」を行いますが、私は人々がほとんどこのアプローチを取るんだと思います。
  • オプション2は本当にシンプルですが、計算コストが高くなります。
  • オプション3はすべてのことを簡単に保つので、私のお気に入りです。
+0

まあが、実際に最も簡単な解決策はlm' 'で' na.action = na.exclude'を入れています。 –

2

私は単純なforループを使用します。適合した値は、それが属していた元の行の属性(名前)を持ちます。したがって:

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

"data"は元のデータフレームです。 (すなわち<に合う - LM(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)] 
} 

ので、私の場合、私は走りました3つのモデル:男性は1、女性は1、組み合わされたモデルは1つ。そして、より便利なものにするために:男性と女性は私のdataに無作為に配布されています。また、私はlm()の入力としてデータが欠落しているので、fit <- lm(y~x, data = data, na.action = na.exclude)を実行して、モデルオブジェクト(fit)にNAsを取得しました。

他人に役立つことを願っています。

は(私はこの記事を見つけた喜んで、それはかなり難しい私の問題/質問を策定することが判明!)

関連する問題