Rpart - 处理缺失值

3

我在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)

然而,我正在努力寻找正确的代码来以正确的方式“传递NA值”到树中的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个回答

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

0

尝试自动将VarA替换为类似于以下内容的东西:

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

这应该用2替换所有的NA。


0

根据您上面的问题,我理解您想在varA失败时使用VarB:

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

但是你的预测完全依赖于VarA(fit),因此在将其传递给rpart之前更改VarA,你将获得预测输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接