2013-03-24 81 views
2

我在Rpart包中使用NA功能而掙扎。我得到了下面的數據幀(代碼如下)Rpart - NA處理

Outcome VarA VarB 
1  1 1 0 
2  1 1 1 
3  1 NA 1 
4  0 0 1 
5  0 0 0 
6  0 NA 0 

我想要適合做出完美預測的Rpart對象。邏輯規則應該是它預測:

  • 如果翻= 1,預測= 1
  • 如果翻= 0,預測= 0
  • 如果翻= NA,然後VarB被使用(如果VarB = 0,預測= 0)

但是,我正在努力找到正確的代碼,以正確的方式向樹中的VarA傳遞「NA值」。我曾嘗試使用usesurrogatesna.control,但無濟於事......請在下面找到我的代碼。

PS。該軟件rpart工作,如果瓦拉會讀VarA=c(1,1,2,0,0,2)但不幸的是這不是我的工作在更大的數據幀的絕佳解決方案....

library(rpart) 
Outcome=c(1,1,1,0,0,0) 
VarA=c(1,1,NA,0,0,NA) 
VarB=c(0,1,1,1,0,0) 
dg=as.data.frame(cbind(Outcome, VarA, VarB))   
dg 
fit=rpart(Outcome ~ VarA + VarB, data=dg, method="class",na.action = na.pass,control=rpart.control(usesurrogate=1, minsplit=1, cp=0.001)) 
fit 

newdata=dg 
newpred=predict(fit,newdata=newdata,type = "class") 
dh=cbind(dg,newpred) 
dh 

回答

0

嘗試用這樣的自動替換VARA:

VarA [is.na(VarA)] <- 2 

這應該與2

0

這裏全部更換NA是我從你上面的問題理解的是您要使用VarB每當翻失敗: -

VarA [is.na(VarA)] <-VarB[is.na(VarA)] 

但是您的預測完全依賴於VarA(適配),因此在將VarA傳遞給rpart之前進行更改,您將獲得預測的輸出。

1

我把你的代碼修改爲使用你想要的NA處理邏輯。

library(rpart) 
Outcome=c(1,1,1,0,0,0) 
VarA=c(1,1,NA,0,0,NA) 
VarB=c(0,1,1,1,0,0) 
dg=as.data.frame(cbind(Outcome, VarA, VarB))   
dg 

我改變了這些行:

dg$VarC <- ifelse(is.na(dg$VarA), ifelse(df$VarB == 1, 1, 0), dg$VarA) 
fit=rpart(Outcome ~ VarC, data=dg, method="class", na.action = na.pass, control=rpart.control(usesurrogate=1, minsplit=1, cp=0.001)) 

的其餘部分是相同的:

fit 

newdata=dg 
newpred=predict(fit,newdata=newdata,type = "class") 
dh=cbind(dg,newpred) 
dh