Fehler beim Abrufen von Vorhersagen von einem lme-Objekt

8

Ich versuche, Vorhersagen für Beobachtungen von einem Objekt zu erhalten. Dies soll recht einfach sein. Da ich jedoch verschiedene Arten von Fehlern für verschiedene Versuche bekomme, scheint mir etwas zu fehlen. Mein Modell ist das folgende:

model <- lme(log(child_mortality) ~ as.factor(cluster)*time +
         my.new.time.one.transition.low.and.middle + ttd +
         maternal_educ+ log(IHME_id_gdppc) + hiv_prev-1,
         merged0,na.action=na.omit,method="ML",weights=varPower(form=~time),
         random= ~ time| country.x,
         correlation=corAR1(form = ~ time),
         control=lmeControl(msMaxIter = 200, msVerbose = TRUE))

Es läuft gut, passt gut zu den Daten und die Ergebnisse sind sinnvoll. Um Vorhersagen zu erhalten, habe ich Folgendes versucht:

test.pred <- data.frame(time=c(10,10,10,10),country.x=c("Poland","Brazil",
            "Argentina","France"),    
             my.new.time.one.transition.low.and.middle=c(1,1,1,0),
             ttd=c(0,0,0,0),maternal_educ=c(10,10,10,10),
             IHME_id_gdppc=c(log(5000),log(8000),log(8000),log(15000)),   
             hiv_prev=c(.005,.005,.005,.005), 
             cluster=c("One Transition, Middle Income","One Transition,   
             Middle Income","One Transition, Middle Income","Democracy, 
             High Income"))
>
> predict(model,test.pred,level=0)


Error in X %*% fixef(object) : non-conformable arguments

Wenn ich beispielsweise Frankreich ausschließe und nur Länder einbeziehe, in denen cluster = "OneTransition, Middle Income" ist, wird ein anderer Fehler angezeigt

# create a toy data set
test.pred0 <-
    expand.grid(time=20:29,country.x=c("Poland","Brazil","Argentina"))
z0 <-as.data.frame(cbind(my.new.time.one.transition.low.and.middle = 
                         c(0,0,0,0,0,0,1,2,3,4), ttd=c(0,0,0,0,0,0,1,0,0,0),
                         maternal_educ=seq(from=10.0, to=12.0, length.out=10),
                         IHME_id_gdppc=log(seq(from=5000, to=8000, length.out=10)),
                         hiv_prev=rep(.005,10),
                         cluster=rep("One Transition, Middle Income",10)))

z <- rbind(z0,z0,z0)
test.pred <- cbind(test.pred0,z)
# check
head(test.pred)
>  time country.x my.new.time.one.transition.low.and.middle ttd
> maternal_educ    IHME_id_gdppc hiv_prev
> 1   20    Poland                                         0   0
>   10 8.51719319141624    0.005
> 2   21    Poland                                         0   0
> 10.2222222222222 8.58173171255381    0.005
> 3   22    Poland                                         0   0
> 10.4444444444444 8.64235633437024    0.005
> 4   23    Poland                                         0   0
> 10.6666666666667 8.69951474821019    0.005
> 5   24    Poland                                         0   0
> 10.8888888888889 8.75358196948047    0.005
> 6   25    Poland                                         0   0
> 11.1111111111111 8.80487526386802    0.005
>                         cluster
> 1 One Transition, Middle Income
> 2 One Transition, Middle Income
> 3 One Transition, Middle Income
> 4 One Transition, Middle Income
> 5 One Transition, Middle Income
> 6 One Transition, Middle Income

# run the predictions
predict(model,test.pred,level=0)
> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
>   contrasts can be applied only to factors with 2 or more levels

In diesem Beispiel ist das Problem ständig auf cluster = "One Transition, Middle Income" zurückzuführen.

Ich verstehe nicht, warum das ein Problem ist. Wenn ich Vorhersagen () zum Laufen bringen möchte, muss ich alle Variablen aus dem Modell einbeziehen, oder? Offensichtlich enthalten die Eingabedaten im Aufruf des Modells nicht in allen Fällen einen Faktor, der auf die gleichen Werte eingestellt ist. Wenn ich jedoch Vorhersagen nur für eine Teilmenge der Daten oder für neue Beobachtungen erhalten möchte, interessiert mich dies möglicherweise nur in Fällen, in denen ein Faktor immer gleich eingestellt ist. Macht das Sinn? Wie kann ich in diesem Fall Vorhersagen erhalten?

Antonio Pedro Ramos
quelle
Ich vermute, das liegt daran, dass R zwei unabhängige Faktoren sieht, wenn Sie zwei Faktoren sehen, einen die Teilmenge des anderen. Nur eine Vermutung: Versuchen Sie, eine neue R-Sitzung zu starten, zu tippen options(stringsAsFactors = FALSE)und dann Ihren Code auszuführen. Das würde verhindern, dass Ihr Original test.predseine eigenen Faktoren hat.
Matt Parker
Danke Matt, funktioniert aber immer noch nicht. Ich bin eigentlich ein Rätsel. Es muss ein Fehler sein.
Antonio Pedro Ramos
Nur eine Umgehung, z. B. ein Faktor von 3 Ebenen A, B, C, können Sie eine Vorhersage für Ebene A mit Daten von 100 A, 1 B und 1 C treffen.
Verbal

Antworten:

8

Vielen Dank für die Bereitstellung der Daten, damit ich einige Diagnosen durchführen kann. Eigentlich ist dies ein epischer Fehler von predict.lme. Sie factorshaben mehr Ebenen in Ihren Anfangsdaten (zum Beispiel haben Sie mehr als 4 Länder) als in Ihren neuen Daten. Eine Codezeile bewirkt speziell, dass die nicht verwendeten Ebenen verworfen werden, sodass Sie Matrizen mit unterschiedlichen Dimensionen erhalten, von denen dienon-conformable arguments

Ich habe diese Zeile entfernt und den Code hier eingefügt .

In R können Sie tun

library(nlme)
source("http://lab.thegrandlocus.com/static/code/predict.lme_patched.txt")

Dadurch wird eine neue Funktion registriert predict.lme, die anstelle der Funktion aus dem Paket aufgerufen wird, nlmeund Sie können Ihren Code ausführen. Zumindest hat es bei mir funktioniert.

Warnung: Der veröffentlichte Code und die Methode sind weder ein Ersatz noch eine echte Fehlerbehebung des Pakets. Die gepatchte Funktion wurde nicht über ihre Fähigkeit hinaus getestet, das Codebit des OP auszuführen.

gui11aume
quelle
Eigentlich schon. Ich habe country.xin beiden. Die Jury ist noch nicht besetzt.
Antonio Pedro Ramos
Ja ... das stimmt. Das tut mir leid. Es scheint, dass einige Ihrer Datentypen bei Ihrer ersten Eingabe und Ihren neuen Daten nicht identisch sind. Dies wird ohne die Daten sehr schwierig sein. Wenn es nicht vertraulich und nicht zu groß ist, können Sie die R-Sitzung speichern und irgendwo ablegen (oder per Post an mich senden)?
gui11aume
Vielen Dank. Haben Sie eine E-Mail an mich, um Ihnen Beispielcode und Daten zu senden?
Antonio Pedro Ramos
Nur eine kurze Frage: Diese Version funktioniert gut für, levels=1aber nicht für level=0?
Antonio Pedro Ramos