2017-06-29 1 views
0

Ich habe über das How to perform a Logistic Regression in R Tutorial über R-Blogger gearbeitet, welches den Datensatz aus der Kaggle Titanic challenge verwendet. Ein Stichwort mit dem ganzen Code in der Post kann here gefunden werden.R - Gibt es eine Möglichkeit, den Bereich der Werte, die durch 'mi' berechnet werden, einzuschränken? (Arbeiten mit Kaggle Titanic Datensatz)

existiert Es fehlende Daten im Trainingsdatensatz:

Missing data in training data set

Daten für 891 Passagiere in diesem Datensatz enthalten sind (891 Zeilen) und 177 haben fehlende Age Werte:

       type missing method model 
PassengerId   continuous  0 <NA> <NA> 
Survived     binary  0 <NA> <NA> 
Pclass  ordered-categorical  0 <NA> <NA> 
Name  unordered-categorical  0 <NA> <NA> 
Sex      binary  0 <NA> <NA> 
Age     continuous  177 ppd linear <---- 
SibSp     continuous  0 <NA> <NA> 
Parch     continuous  0 <NA> <NA> 
Ticket  unordered-categorical  0 <NA> <NA> 
Fare     continuous  0 <NA> <NA> 
Cabin  unordered-categorical  687 ppd mlogit 
Embarked unordered-categorical  2 ppd mlogit 

Im Tutorial werden die fehlenden Werte einfach durch den Mittelwert der vorliegenden Age Werte ersetzt:

data$Age[is.na(data$Age)] <- mean(data$Age,na.rm=T)

Ich interessiere mich für die fehlende Werte und rechnen statt Mittelwert oder Median Ersatz zu tun. Es gibt mehrere Imputationsbibliotheken, wie Amelia und MICE, aber ich habe mi in der Vergangenheit verwendet, weshalb ich mi für dieses Problem gewählt habe.

Das Hauptproblem ist, dass der Bereich des kalkulatorischen Wertes, wenn ich verwenden mi nicht angemessen war:

Age vs Imputed

Der rote Balken der Mittelwert jeder Verteilung ist. Das Alter der Passagiere reicht von 0,42 bis 80 (Jahre). Die kalkulatorischen Werte reichen von weniger als -100 bis mehr als 200.

Boxplot

Offensichtlich ist dies überhaupt nicht sinnvoll ist. Unten ist der Code, den ich verwendet habe. Ich habe die mi vignette als Leitfaden verwendet.

library(mi) 

    training.data.raw <- read.csv("train.csv", header = TRUE, na.strings = c("")) 
    # create missing data frame for use with mi 
    training.data.raw.mdf <- missing_data.frame(training.data.raw) 
    #image(training.data.raw.mdf) 


    # adjust variable types 
    training.data.raw.mdf <- change(training.data.raw.mdf, y = "Parch", what = "type", to = "ord") 
    training.data.raw.mdf <- change(training.data.raw.mdf, y = "SibSp", what = "type", to = "count") 
    training.data.raw.mdf <- change(training.data.raw.mdf, y = "PassengerId", what = "type", to = "irrelevant") 

    # parallel imputation should be default on non-Windows systems (i.e. Linux) 
    imputations <- mi(training.data.raw.mdf, n.iter = 30, n.chains = 4, max.minutes = 20) 
    round(mipply(imputations, mean, to.matrix = TRUE), 3) 

    # get data frames 
    imputed.dataframes <- complete(imputations, m = 1) 

Gibt es eine Möglichkeit den Bereich der kalkulatorische Werte zu steuern, dass die sie zwischen fallen, sagen wir mal, 0 und 80?

Ich benutze gerne jede Imputationsbibliothek - mi, MICE, amelia - solange vernünftige Ergebnisse erzielt werden. Beliebige Methoden und Bibliotheken, die vernünftige Ergebnisse liefern, sind von Interesse.

Antwort

2

Probieren Sie die bounded-continuous-class Option aus der mi package. Das sollte es für dich tun. Hier

ist das Beispiel aus der Dokumentation:

# STEP 0: GET DATA 
data(CHAIN, package = "mi") 

# STEP 0.5 CREATE A missing_variable (you never need to actually do this) 
lo_bound <- 0 
hi_bound <- rep(Inf, nrow(CHAIN)) 
hi_bound[CHAIN$log_virus == 0] <- 6 

log_virus <- missing_variable(ifelse(CHAIN$log_virus == 0, NA, CHAIN$log_virus), 
           type = "bounded-continuous", 
           lower = lo_bound, upper = hi_bound) 

show(log_virus) 
Verwandte Themen