lmeオブジェクトから予測を取得する際のエラー


8

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()を機能させるには、モデルのすべての変数を含める必要がありますよね?明らかに、モデルの呼び出しの入力データには、すべてのケースで同じ値に設定された因子は含まれません。それでも、データのサブセットまたは新しい観測についてのみ予測を取得したい場合は、いくつかの要素が常に同じに設定されている場合にのみ興味があるかもしれません。それは意味がありますか?その場合、どうすれば予測を取得できますか?


これは、2つの要素があり、一方が他方のサブセットであるのに対して、Rは2つの無関係な要素を見ているためだと思います。ちょっとした勘違い:新しいRセッションを開始しoptions(stringsAsFactors = FALSE)、と入力して、コードを実行してみてください。それはあなたのオリジナルtest.predが独自の要因を持つことを防ぎます。
Matt Parker

Mattに感謝しますが、まだ機能していません。私は実際にパズルです。それはある種の間違いに違いない。
Antonio Pedro Ramos

周りだけの仕事、例えばあなたが100 A、1件のBおよび1 CのデータでレベルAのための予測を行うことができます3つのレベルA、B、Cの要因
口頭

回答:


8

いくつかの診断を実行できるようにデータを提供してくれてありがとう。実際、これはの壮大なバグですpredict.lme。あなたのfactorsあなたの最初のデータでより多くのレベルを持っているあなたの新しいデータよりも(たとえば、あなたはより多くの4カ国以上持っています)。コードの行により、未使用のレベルが破棄されるようになり、異なる次元の行列になってしまいます。non-conformable arguments

その行を削除して、コードをここに配置しました

Rでできること

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

これpredict.lmeにより、パッケージの関数の代わりに呼び出される新しい関数が登録され、nlmeコードを実行できます。少なくともそれは私のために働いた。

警告:投稿されたコードとメソッドは、パッケージの置き換えでも実際のバグ修正でもありません。パッチが当てられた関数は、OPのコードのビットを実行する機能を超えてテストされていません。


実際にはそうです。私が持っているcountry.xの両方で。陪審はまだ出ていません。
Antonio Pedro Ramos

はい...そうです。申し訳ありません。一部のデータタイプは、初期入力と新しいデータで同じではないようです。これをデータなしで行うのは非常に困難です。機密ではなく、大きすぎない場合は、Rセッションを保存してどこかに置く(またはメールで送信する)ことができますか?
gui11aume

どうもありがとうございました。サンプルコードとデータを送信するためのメールがありますか?
Antonio Pedro Ramos

簡単な質問ですが、このバージョンは問題levels=1なく機能しlevel=0ますか?
Antonio Pedro Ramos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.