lmeオブジェクトから観測の予測を取得しようとしています。これは非常に簡単なはずです。しかし、さまざまな試行でさまざまなタイプのエラーが発生するため、何かが足りないようです。私のモデルは次のとおりです:
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))
それはうまく動作し、データによく適合し、結果は理にかなっています。予測を得るために、私は以下を試しました:
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
たとえばフランスを除外し、cluster = "OneTransition、Middle Income"である国のみを含めると、別のエラーが発生します
# 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
この例では、問題は常にcluster = "One Transition、Middle Income"が原因です。
これが問題である理由がわかりません。predict()を機能させるには、モデルのすべての変数を含める必要がありますよね?明らかに、モデルの呼び出しの入力データには、すべてのケースで同じ値に設定された因子は含まれません。それでも、データのサブセットまたは新しい観測についてのみ予測を取得したい場合は、いくつかの要素が常に同じに設定されている場合にのみ興味があるかもしれません。それは意味がありますか?その場合、どうすれば予測を取得できますか?
options(stringsAsFactors = FALSE)
、と入力して、コードを実行してみてください。それはあなたのオリジナルtest.pred
が独自の要因を持つことを防ぎます。