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?
quelle
options(stringsAsFactors = FALSE)
und dann Ihren Code auszuführen. Das würde verhindern, dass Ihr Originaltest.pred
seine eigenen Faktoren hat.Antworten:
Vielen Dank für die Bereitstellung der Daten, damit ich einige Diagnosen durchführen kann. Eigentlich ist dies ein epischer Fehler von
predict.lme
. Siefactors
haben 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
Dadurch wird eine neue Funktion registriert
predict.lme
, die anstelle der Funktion aus dem Paket aufgerufen wird,nlme
und 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.
quelle
country.x
in beiden. Die Jury ist noch nicht besetzt.levels=1
aber nicht fürlevel=0
?