我正在努力使用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“传递给树”。我曾尝试使用usesurrogates
和na.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
答案 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中进行更改。你将获得预测的输出。