Вы сравниваете две совершенно разные модели, которые дают разную интерпретацию.
Если вас интересует, как качество влияет на школу, а другие ковариаты ставятся в качестве случайного перехвата, первая модель верна. Я быстро проверил и нашел этот пост , в котором упоминается перекрестный эффект, и если вы запустите модель со всеми вашими случайными перехватами в компоненте дисперсии, вы получите примерно тот же результат:
data['group'] = 1
md2 = smf.mixedlm('score ~ quality',
vc_formula = {"title":"0 + title","rater":"0 + rater"},
groups = data['group'], data = data).fit().summary()
Model: MixedLM Dependent Variable: score
No. Observations: 15 Method: REML
No. Groups: 1 Scale: 0.0014
Min. group size: 15 Log-Likelihood: 22.0951
Max. group size: 15 Converged: No
Mean group size: 15.0
Coef. Std.Err. z P>|z| [0.025 0.975]
Intercept 0.620 0.016 38.313 0.000 0.588 0.652
quality[T.good] -0.015 0.021 -0.736 0.462 -0.056 0.026
rater Var 0.000 0.030
title Var 0.000
Вопрос в том, появляется ли «рейтинг» в этой таблице. V C также предназначен для определения более сложных моделей, например, с переменным наклоном, поэтому, если это чистый случайный перехват, я думаю, вы можете использовать комбинацию group и V C.
Во второй модели вы моделируете счет только с перехватом, независимым от качества, что не имеет смысла, если вы заинтересованы в качестве.
Наконец, мы можем проверить результаты в R со следующим:
df = structure(list(rater = structure(c(3L, 2L, 1L, 3L, 2L, 1L, 3L,
2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L), .Label = c("emma", "frank",
"john"), class = "factor"), title = structure(c(1L, 2L, 3L, 4L,
5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c("book_1",
"book_2", "book_3", "book_4", "book_5"), class = "factor"), quality = structure(c(2L,
1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L), .Label = c("bad",
"good"), class = "factor"), score = c(0.600833333, 0.683020833,
0.653645833, 0.6528125, 0.6040625, 0.600833333, 0.522, 0.600833333,
0.619464286, 0.600833333, 0.57125, 0.6296875, 0.607205882, 0.61203125,
0.600833333)), class = "data.frame", row.names = c(NA, -15L))
library(lme4)
summary(lmer(score ~ quality + (1|rater) + (1|title),data=df))
boundary (singular) fit: see ?isSingular
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ quality + (1 | rater) + (1 | title)
Data: df
REML criterion at convergence: -44.4
Scaled residuals:
Min 1Q Median 3Q Max
-2.60015 -0.09695 -0.09695 0.16712 1.67924
Random effects:
Groups Name Variance Std.Dev.
title (Intercept) 0.000000 0.00000
rater (Intercept) 0.000000 0.00000
Residual 0.001416 0.03763
Number of obs: 15, groups: title, 5; rater, 3
Fixed effects:
Estimate Std. Error t value
(Intercept) 0.61984 0.01536 40.351
qualitygood -0.01535 0.01983 -0.774
Correlation of Fixed Effects:
(Intr)
qualitygood -0.775
convergence code: 0
boundary (singular) fit: see ?isSingular
Более или менее похож на вашу первую модель, но из-за ваших данных не легко получить оценку ваших случайных эффектов.