2014-06-16 19 views
5

Ich habe einige Probleme mit der Vorhersagefunktion, wenn Sie bayesglm verwenden. Ich habe einige Posts gelesen, die sagen, dass dieses Problem auftreten kann, wenn die Out-of-Sample-Daten mehr Ebenen als die in Beispieldaten haben, aber ich verwende die gleichen Daten für die Passform und Vorhersagefunktionen. Predict funktioniert gut mit normalem glm, aber nicht mit bayesglm. Beispiel:Bayes vorhersagen, tiefgestellt außerhalb der Grenzen

control <- y ~ x1 + x2 

# this works fine: 
glmObject <- glm(control, myData, family = binomial()) 
predicted1 <- predict.glm(glmObject , myData, type = "response") 

# this gives an error: 
bayesglmObject <- bayesglm(control, myData, family = binomial()) 
predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 
Error in X[, piv, drop = FALSE] : subscript out of bounds 

# Edit... I just discovered this works. 
# Should I be concerned about using these results? 
# Not sure why is fails when I specify the dataset 
predicted3 <- predict(bayesglmObject, type = "response") 

Ich kann nicht herausfinden, wie man mit einem Bayesglm-Objekt vorhersagen kann. Irgendwelche Ideen? Vielen Dank!

Antwort

2

Einer der Gründe könnte mit der Standardeinstellung für den Parameter "drop.unused.levels" im Befehl bayesglm zu tun haben. Standardmäßig ist dieser Parameter auf TRUE gesetzt. Wenn es also ungenutzte Ebenen gibt, wird sie während des Modellbaus fallen gelassen. Die Vorhersagefunktion verwendet jedoch immer noch die ursprünglichen Daten mit den ungenutzten Ebenen, die in der Faktorvariablen vorhanden sind. Dies führt zu Niveauunterschieden zwischen den Daten, die für die Modellbildung verwendet werden, und der für die Vorhersage verwendeten Daten (auch wenn es sich um die gleiche Datenkategorie handelt - in Ihrem Fall myData). Ich habe ein Beispiel unten angegeben:

n <- 100 
    x1 <- rnorm (n) 
    x2 <- as.factor(sample(c(1,2,3),n,replace = TRUE)) 

    # Replacing 3 with 2 makes the level = 3 as unused 
    x2[x2==3] <- 2 

    y <- as.factor(sample(c(1,2),n,replace = TRUE)) 

    myData <- data.frame(x1 = x1, x2 = x2, y = y) 
    control <- y ~ x1 + x2 

    # this works fine: 
    glmObject <- glm(control, myData, family = binomial()) 
    predicted1 <- predict.glm(glmObject , myData, type = "response") 

    # this gives an error - this uses default drop.unused.levels = TRUE 
    bayesglmObject <- bayesglm(control, myData, family = binomial()) 
    predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 

    Error in X[, piv, drop = FALSE] : subscript out of bounds 

    # this works fine - value of drop.unused.levels is set to FALSE 
    bayesglmObject <- bayesglm(control, myData, family = binomial(),drop.unused.levels = FALSE) 
    predicted2 <- predict.bayesglm(bayesglmObject , myData, type = "response") 

Ich denke, ein besserer Weg wäre droplevels zu verwenden, um die nicht genutzten Ebene aus dem Datenrahmen vorher fallen zu lassen und es sowohl für die Modellbildung und Vorhersage verwenden.

Verwandte Themen