2013-03-24 4 views
2

Я борюсь с функциональностью NA в пакете Rpart. Я получил следующий dataframe (код ниже) заRpart - обработка НД

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 объект, который делает идеальный прогноз. Логическое правило должно быть то, что он предсказывает, что:

  • Если вар = 1, предсказание = 1
  • Если вар = 0, предсказание = 0
  • Если вар = NA, то используется VarB (Если VarB = 0, предсказание = 0)

Однако я изо всех сил стараюсь найти правильный код для «передачи значений NA» для VarA по дереву правильно. Я пытался работать с usesurrogates и na.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 

ответ

0

Попробуйте заменить Vara автоматически с чем-то вроде этого:

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

Это должно заменить все NA с 2.

0

Вот что я понял из вашего выше вопроса вы хотите использовать VarB всякий раз, когда Vara не удается: -

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

, но ваше предсказание полностью зависит от VarA (fit), поэтому внесите изменения в VarA, прежде чем передавать его на rpart.you получите свой прогнозируемый результат.

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 
Смежные вопросы