Rpart - NA处理

时间:2013-03-24 17:56:41

标签: r na rpart

我正在努力使用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对象。逻辑规则应该是它预测:

  • 如果VarA = 1,则预测= 1
  • 如果VarA = 0,则预测= 0
  • 如果VarA = NA,则使用VarB(如果VarB = 0,预测= 0)

但是,我正在努力找到正确的代码,以正确的方式将VarA“传递给树”。我曾尝试使用usesurrogatesna.control,但无济于事...请在下面找到我的代码。

PS。如果VarA读取VarA=c(1,1,2,0,0,2),则rpart有效但不幸的是,对于我正在处理的更大的数据帧,这不是一个很好的解决方案....

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

尝试使用以下内容自动替换VarA:

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

这应该用2替换所有NA。

答案 2 :(得分:0)

以下是我从上述问题中理解的是,只要varA失败,您就想使用VarB: -

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

但是你的预测完全取决于VarA(拟合),所以在将它传递给rpart之前在VarA中进行更改。你将获得预测的输出。