Pertimbangkan data sleepstudy, termasuk dalam lme4. Bates membahas hal ini dalam buku daringnya tentang lme4. Dalam bab 3, ia mempertimbangkan dua model untuk data.
M.0 : Reaksi ∼ 1 + Hari + ( 1 | Subjek ) + ( 0 + Hari | Subjek )
dan
M.A : Reaksi ∼ 1 + Hari + ( Hari | Subjek )
Penelitian ini melibatkan 18 subjek, dipelajari selama 10 hari kurang tidur. Waktu reaksi dihitung pada awal dan pada hari-hari berikutnya. Ada efek yang jelas antara waktu reaksi dan durasi kurang tidur. Ada juga perbedaan yang signifikan antara subjek. Model A memungkinkan untuk kemungkinan interaksi antara mencegat acak dan efek lereng: bayangkan, katakanlah, bahwa orang dengan waktu reaksi yang buruk menderita lebih akut dari efek kurang tidur. Ini akan menyiratkan korelasi positif dalam efek acak.
Dalam contoh Bates, tidak ada korelasi yang jelas dari plot Lattice dan tidak ada perbedaan yang signifikan antara model. Namun, untuk menyelidiki pertanyaan yang diajukan di atas, saya memutuskan untuk mengambil nilai-nilai yang sesuai dari sleepstudy, meningkatkan korelasi dan melihat kinerja kedua model.
Seperti yang dapat Anda lihat dari gambar, waktu reaksi lama dikaitkan dengan kehilangan kinerja yang lebih besar. Korelasi yang digunakan untuk simulasi adalah 0,58
Saya mensimulasikan 1000 sampel, menggunakan metode simulasi di lme4, berdasarkan nilai-nilai yang pas dari data buatan saya. Saya cocok M0 dan Ma untuk masing-masing dan melihat hasilnya. Set data asli memiliki 180 pengamatan (10 untuk masing-masing 18 mata pelajaran), dan data yang disimulasikan memiliki struktur yang sama.
Intinya adalah bahwa ada sedikit perbedaan.
- Parameter tetap memiliki nilai yang persis sama di bawah kedua model.
- Efek acak sedikit berbeda. Ada 18 efek mencegat dan 18 kemiringan acak untuk setiap sampel yang disimulasikan. Untuk setiap sampel, efek-efek ini dipaksa untuk ditambahkan ke 0, yang berarti bahwa perbedaan rata-rata antara kedua model adalah (secara artifisial) 0. Tetapi varians dan kovarian berbeda. Median kovarians di bawah MA adalah 104, melawan 84 di bawah M0 (nilai aktual, 112). Varian dari lereng dan penyadapan lebih besar di bawah M0 dari MA, mungkin untuk mendapatkan ruang gerak tambahan yang dibutuhkan tanpa adanya parameter kovarian gratis.
- Metode ANOVA untuk lmer memberikan statistik F untuk membandingkan model Slope dengan model dengan hanya intersep acak (tidak ada efek karena kurang tidur). Jelas, nilai ini sangat besar di bawah kedua model, tetapi biasanya (tetapi tidak selalu) lebih besar di bawah MA (rata-rata 62 vs rata-rata 55).
- Perbedaan kovarians dan efek tetap berbeda.
- Sekitar separuh waktu, ia tahu bahwa MA benar. Nilai p rata-rata untuk membandingkan M0 dengan MA adalah 0,0442. Meskipun terdapat korelasi yang berarti dan 180 pengamatan seimbang, model yang tepat hanya akan dipilih sekitar separuh waktu.
- Nilai yang diprediksi berbeda di bawah kedua model, tetapi sangat sedikit. Perbedaan rata-rata antara prediksi adalah 0, dengan sd dari 2.7. Sd dari nilai yang diprediksi sendiri adalah 60,9
Jadi mengapa ini terjadi? @ung menduga, cukup, bahwa kegagalan untuk memasukkan kemungkinan korelasi memaksa efek acak menjadi tidak berkorelasi. Mungkin seharusnya; tetapi dalam implementasi ini, efek acak diizinkan untuk dikorelasikan, yang berarti bahwa data dapat menarik parameter ke arah yang benar, terlepas dari modelnya. Kesalahan dari model yang salah muncul dalam kemungkinan, itulah sebabnya Anda dapat (kadang-kadang) membedakan dua model di tingkat itu. Model efek campuran pada dasarnya sesuai dengan regresi linier untuk setiap subjek, dipengaruhi oleh apa yang menurut model seharusnya. Model yang salah memaksa kecocokan nilai yang kurang masuk akal daripada yang Anda dapatkan di bawah model yang tepat. Tetapi parameter, pada akhirnya, diatur oleh kecocokan dengan data aktual.
Ini kode saya yang agak kikuk. Idenya adalah agar sesuai dengan data studi tidur dan kemudian membangun set data simulasi dengan parameter yang sama, tetapi korelasi yang lebih besar untuk efek acak. Kumpulan data diumpankan ke simulasi.lmer () untuk mensimulasikan 1000 sampel, yang masing-masing sesuai dengan kedua cara. Setelah saya memasangkan objek yang pas, saya bisa mengeluarkan fitur yang berbeda dari fit dan membandingkannya, menggunakan uji-t, atau apa pun.
# Fit a model to the sleep study data, allowing non-zero correlation
fm01 <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=sleepstudy, REML=FALSE)
# Now use this to build a similar data set with a correlation = 0.9
# Here is the covariance function for the random effects
# The variances come from the sleep study. The covariance is chosen to give a larger correlation
sigma.Subjects <- matrix(c(565.5,122,122,32.68),2,2)
# Simulate 18 pairs of random effects
ranef.sim <- mvrnorm(18,mu=c(0,0),Sigma=sigma.Subjects)
# Pull out the pattern of days and subjects.
XXM <- model.frame(fm01)
n <- nrow(XXM) # Sample size
# Add an intercept to the model matrix.
XX.f <- cbind(rep(1,n),XXM[,2])
# Calculate the fixed effects, using the parameters from the sleep study.
yhat <- XX.f %*% fixef(fm01 )
# Simulate a random intercept for each subject
intercept.r <- rep(ranef.sim[,1], each=10)
# Now build the random slopes
slope.r <- XXM[,2]*rep(ranef.sim[,2],each=10)
# Add the slopes to the random intercepts and fixed effects
yhat2 <- yhat+intercept.r+slope.r
# And finally, add some noise, using the variance from the sleep study
y <- yhat2 + rnorm(n,mean=0,sd=sigma(fm01))
# Here is new "sleep study" data, with a stronger correlation.
new.data <- data.frame(Reaction=y,Days=XXM$Days,Subject=XXM$Subject)
# Fit the new data with its correct model
fm.sim <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=new.data, REML=FALSE)
# Have a look at it
xyplot(Reaction ~ Days | Subject, data=new.data, layout=c(6,3), type=c("p","r"))
# Now simulate 1000 new data sets like new.data and fit each one
# using the right model and zero correlation model.
# For each simulation, output a list containing the fit from each and
# the ANOVA comparing them.
n.sim <- 1000
sim.data <- vector(mode="list",)
tempReaction <- simulate(fm.sim, nsim=n.sim)
tempdata <- model.frame(fm.sim)
for (i in 1:n.sim){
tempdata$Reaction <- tempReaction[,i]
output0 <- lmer(Reaction ~ 1 + Days +(1|Subject)+(0+Days|Subject), data = tempdata, REML=FALSE)
output1 <- lmer(Reaction ~ 1 + Days +(Days|Subject), data=tempdata, REML=FALSE)
temp <- anova(output0,output1)
pval <- temp$`Pr(>Chisq)`[2]
sim.data[[i]] <- list(model0=output0,modelA=output1, pvalue=pval)
}