4

ここに私の問題があります。混合効果モデルを実行する必要がある R のデータ セットがあります。コードは次のとおりです。

data <- read.csv("D:/blahblah.csv")
analysis.data <- lmer(intdiff ~ stress_limit * word_position * follows + (1|speaker), data)
summary(analysis.data)

スクリプトを実行しようとすると、次のエラーが返されます。

 Error in mer_finalize(ans) : Downdated X'X is not positive definite, 15.

「follows」パラメーターまでエラーを追跡しました。これは、stress_limit と word_position を使用するだけで正常に動作するためです。「follows」のデータは、n または l、子音、母音の 3 つの文字列のみです。スペースを _ に置き換えてみましたが、成功しませんでした。この場合、「フォロー」の使用を妨げている lmer() 関数の内部動作について何かありますか? どんな助けでも素晴らしいでしょう!

詳細情報: intdiff には数値が含まれ、stress_limit は文字列 (Stressed または Unstressed) であり、単語の位置も文字列 (Word Medial または Word Initial) です。

編集: エラーを再現するデータ サンプルを次に示します。

structure(list(intdiff = c(11.45007951, 12.40144758, 13.47898367, 
6.279497762, 18.19461897, 16.15539707), word_position = structure(c(2L, 
2L, 2L, 1L, 1L, 1L), .Label = c("Word Initial", "Word Medial"
), class = "factor"), follows = structure(c(4L, 4L, 4L, 1L, 2L, 
4L), .Label = c("Consonant", "n or l", "Pause", "Vowel"), class = "factor"), 
stress_limit = structure(c(2L, 1L, 1L, 2L, 2L, 2L), .Label = c("Stressed", 
"Unstressed"), class = "factor"), speaker = structure(c(2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("f11r", "f13r", "f15a", "f16a", 
"m09a", "m10a", "m12r", "m14r"), class = "factor")), .Names = c("intdiff", 
"word_position", "follows", "stress_limit", "speaker"), row.names = c(NA, 
6L), class = "data.frame")

lme() 関数も試しましたが、次のエラーが返されました。

Error in MEEM(object, conLin, control$niterEM) : 
Singularity in backsolve at level 0, block 1

元の投稿のコードは、私が使用している正確なコードから library(lme4) 呼び出しを除いたものであるため、考えられる情報を省略していません。

私のRバージョンは2.15.2です

4

1 に答える 1

10

再現可能な例がなければ確実に判断するのは難しい:優れたRの再現可能な例を作成するにはどうすればよいですか?

しかし、推測:これらの種類の問題は、一般に計画行列の共線性が原因です。連続予測子(intdiff)を中央に配置すると役立つ場合があります。計画行列を直接調べることもできます

X <- model.matrix( ~ stress_limit * word_position * follows, data)

ペア間の共線性:cor(X)。残念ながら、分散拡大係数を計算するためのツールを調べることはできますが、頭のてっぺんから多重library("sos"); findFn("VIF")共線性(つまり、ペア間ではなく、2つを超える予測子の組み合わせ間)を検出するための提案はありません(例)。

クロスチェックとして、lmeモデルを処理できる必要があります。

library(nlme)
lme(intdiff ~ stress_limit * word_position * follows, 
   random=~1|speaker, data=data)

lme4の開発バージョン(githubで入手可能)でテストデータを実行すると、が表示されますError in lmer(intdiff ~ stress_limit * word_position * follows + (1 | : rank of X = 5 < ncol(X) = 12。一方、この小さな入力データセット(6つの観測値)では、12個のパラメーターを適合させる方法はありません。問題がどこにあるかを正確に判断するのは少し難しいです。3つの変数の12の組み合わせすべてが実際にデータで発生しますか?一部が欠落している場合は、開発バージョンのヘルプに記載されているアドバイスに従う必要があります。

完全に共線的な予測変数を自動的に検出する「lm」や「glm」などのいくつかの単純なモデリングフレームワークとは異なり、「[gn]lmer」はフルランク未満の計画行列を処理できません。たとえば、レベルの組み合わせが観察されない相互作用を持つモデルの場合、新しい変数を定義するのはユーザーの責任です(たとえば、'droplevels(interaction(a、b)の結果からデータ内に' ab'を作成します) )')。

特に、このモデルは次のように適合させることができます。

data <- transform(data,
       allcomb=interaction(stress_limit,word_position,follow,drop=TRUE))
lme(intdiff ~ allcomb, random=~1|speaker, data=data)

これにより、データに実際に存在するレベルの一意の組み合わせをカテゴリとして扱う一元配置分散分析が得られます。それらが何を意味するのかを自分で理解する必要があります。

別の方法は、組み合わせが欠落していないセットに到達するまで、モデル内の交互作用の数を減らすことです。運が良ければ(stress_limit+word_position+follow)^2(すべての双方向の交互作用)は機能しますが、モデルをさらに縮小する必要がある場合があります(例stress_limit + word_position*follow)。

これをテストする別の方法は、提案されたモデルで使用し、推定された係数に値lm()がないことを確認することです。NA

これらの方法で失われる主なことは、欠落している組み合わせのパラメーターをデータから推定できなかったため、解釈の利便性/容易さです...

于 2013-02-02T01:23:03.170 に答える