2013-03-24 69 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