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)

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

PS。如果 VarA 可以读取,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
4

3 回答 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
于 2013-09-22T20:18:50.253 回答
0

这是我从您的上述问题中了解到的,您想在 varA 失败时使用 VarB:-

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

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

于 2013-08-23T07:25:52.010 回答
0

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

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

这应该用 2 替换所有 NA。

于 2013-08-15T21:00:46.413 回答