Rpart - NA处理

bweufnob  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(99)

我在Rpart包中的NA功能上遇到了困难。我得到了以下 Dataframe (代码如下)

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的NA值“传递”到树中。我尝试过使用usesurrogatesna.control,但没有效果...请在下面找到我的代码。
PS. rpart工作,如果VarA将读取VarA=c(1,1,2,0,0,2),但不幸的是,这不是一个伟大的解决方案,为更大的 Dataframe ,我正在工作。

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
x4shl7ld

x4shl7ld1#

我使用了您的代码并对其进行了修改,以使用您想要的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
0mkxixxg

0mkxixxg2#

尝试将VarA自动替换为如下内容:

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

这应将所有NA替换为2。

0x6upsns

0x6upsns3#

这是我从你上面的问题中了解到的,当varA失败时,你想使用VarB:-

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

但是您的预测完全取决于VarA(fit),因此在将VarA传递到www.example.com之前对其进行更改rpart.you将获得预测输出。

相关问题