1. ホーム
  2. r

[解決済み] lmer エラー: グループ化係数は観測数未満でなければならない

2022-02-08 21:35:52

質問

私はいくつかのデータで混合効果モデルを実行しようとしていますが、固定効果の1つで苦労しています、私はそれが主に要因によるものだと思います!

サンプルデータです。

data4<-structure(list(code = structure(1:10, .Label = c("10888", "10889", 
"10890", "10891", "10892", "10893", "10894", "10896", "10897", 
"10898", "10899", "10900", "10901", "10902", "10903", "10904", 
"10905", "10906", "10907", "10908", "10909", "10910", "10914", 
"10916", "10917", "10919", "10920", "10922", "10923", "10924", 
"10925", "10927"), class = "factor"), speed = c(0.0296315046039244, 
0.0366986630049636, 0.0294297725505692, 0.048316183511095, 0.0294275666501456, 
0.199924957584131, 0.0798850288176711, 0.0445886457047146, 0.0285993712316451, 
0.0715158276875623), meanflow = c(0.657410742496051, 0.608271363339857, 
0.663241108786611, 0.538259450171821, 0.666299529534762, 0.507156583629893, 
0.762448863636364, 37.6559178370787, 50.8557196935557, 31.6601587837838
), length = c(136, 157, 132, 140, 135, 134, 144, 149, 139, 165
), river = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L
), .Label = c("c", "f"), class = "factor")), .Names = c("code", 
"speed", "meanflow", "length", "river"), row.names = c(2L, 4L, 
6L, 8L, 10L, 12L, 14L, 16L, 18L, 20L), class = "data.frame")

私のモデルはこのようなものです。

model1<-lmer(speed ~ river + length +(1|meanflow)+(1|code), data4)

で、実行するとエラーメッセージが返ってきます。

Error in checkNlevels(reTrms$flist, n = n, control) : 
number of levels of each grouping factor must be < number of observations

インターネットを探し回った結果 1件の回答がありました。

が、どうしても質問に対する回答が理解できない!

解決方法は?

ここで2つの問題があります。

  • の値ごとに1つずつ観測しているように見えます。 code . つまり,残差分散(これは lmer 一般的には線形混合モデル)、および、amone-to-amone(amone-to-amone) code 分散 -- これらのパラメータは両方とも同じ分散成分を推定しようとするものであり,どのような組み合わせの var(residual)var(code) を足した値が同じであれば、同じようにデータへの適合度が高いことを表します。

  • の値ごとに1つの観測値を持っています。 meanflow これは meanflow は連続変数であり、通常これは グループ化変数 をモデルで使用します。 この用語で何を捉えようとしているのか、よくわからないのですが。

これらのモデルを実際にフィットさせることができます。 lmerControl でチェックを回避することができますが、必ずしも賢明な結果が得られるわけではありません!

model2 <- lmer(speed ~ river + length +(1|meanflow)+(1|code), data4,
    control=lmerControl(check.nobs.vs.nlev = "ignore",
     check.nobs.vs.rankZ = "ignore",
     check.nobs.vs.nRE="ignore"))

ここでは、分散をほぼ3等分しています。

 VarCorr(model2)
 ##  Groups   Name        Std.Dev.
 ##  meanflow (Intercept) 0.035354
 ##  code     (Intercept) 0.032898
 ##  Residual             0.033590

ランダム効果を1つだけ(やはり不適切)使用した場合。

model0 <- lmer(speed ~ river + length +(1|meanflow), data4,
    control=lmerControl(check.nobs.vs.nlev = "ignore",
     check.nobs.vs.rankZ = "ignore",
     check.nobs.vs.nRE="ignore"))

これで、分散はちょうど半分になりました。

VarCorr(model0)
##  Groups   Name        Std.Dev.
##  meanflow (Intercept) 0.041596
##  Residual             0.041596