2014-06-16 38 views
5

Mam pewne problemy z funkcją przewidywania podczas korzystania z bayesglm. Czytałem niektóre posty, które mówią, że ten problem może powstać, gdy dane z próbki mają więcej poziomów niż w przykładowych danych, ale używam tych samych danych dla funkcji dopasowania i przewidywania. Przewidywanie działa dobrze z regularnym glmem, ale nie z bayesglm. Przykład:Bayes predict, subscript out of bounds

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") 

Nie można określić sposobu przewidywania za pomocą obiektu bayesglm. Jakieś pomysły? Dzięki!

Odpowiedz

2

Jedną z przyczyn może być ustawienie domyślne dla parametru "drop.unused.levels" w komendzie bayesglm. Domyślnie ten parametr ma wartość TRUE. Więc jeśli są nieużywane poziomy, zostaje on odrzucony podczas budowania modelu. Jednak funkcja przewidywania nadal wykorzystuje oryginalne dane z nieużywanymi poziomami obecnymi w zmiennej czynnikowej. Powoduje to różnice w poziomie między danymi wykorzystywanymi do budowania modelu a tymi używanymi do przewidywania (nawet jeśli jest to ta sama nazwa danych - w twoim przypadku, myData). Dałem przykład poniżej:

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") 

Myślę, że lepszym sposobem byłoby wykorzystanie droplevels spadać niewykorzystane poziomy z ramki danych wcześniej i używać go zarówno do budynku modelu i przewidywania.