คุณสามารถทดสอบความสำคัญของพารามิเตอร์โมเดลด้วยความช่วยเหลือของช่วงความเชื่อมั่นโดยประมาณสำหรับแพ็คเกจ lme4 มีconfint.merMod
ฟังก์ชัน
bootstrapping (ดูตัวอย่างConfidence Interval จาก bootstrap )
> confint(m, method="boot", nsim=500, oldNames= FALSE)
Computing bootstrap confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.32764600 0.64763277
cor_conditionexperimental.(Intercept)|participant_id -1.00000000 1.00000000
sd_conditionexperimental|participant_id 0.02249989 0.46871800
sigma 0.97933979 1.08314696
(Intercept) -0.29669088 0.06169473
conditionexperimental 0.26539992 0.60940435
โปรไฟล์ความน่าจะเป็น (ดูตัวอย่างเช่นความสัมพันธ์ระหว่างโอกาสในโปรไฟล์และช่วงความมั่นใจคืออะไร )
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.3490878 0.66714551
cor_conditionexperimental.(Intercept)|participant_id -1.0000000 1.00000000
sd_conditionexperimental|participant_id 0.0000000 0.49076950
sigma 0.9759407 1.08217870
(Intercept) -0.2999380 0.07194055
conditionexperimental 0.2707319 0.60727448
นอกจากนี้ยังมีวิธีการ'Wald'
แต่จะใช้กับเอฟเฟกต์คงที่เท่านั้น
นอกจากนี้ยังมีอยู่ชนิดของ ANOVA (อัตราส่วน) บางชนิดในการแสดงออกในแพคเกจซึ่งมีชื่อว่าlmerTest
ranova
แต่ฉันไม่สามารถเข้าใจได้จากเรื่องนี้ การกระจายของความแตกต่างใน logLikelihood เมื่อสมมติฐานว่าง (ความแปรปรวนเป็นศูนย์สำหรับผลสุ่ม) เป็นความจริงไม่ได้กระจายไคสแควร์ (อาจเป็นไปได้เมื่อจำนวนผู้เข้าร่วมและการทดลองสูงทดสอบอัตราส่วนความน่าจะเป็น
ความแปรปรวนในกลุ่มเฉพาะ
เพื่อให้ได้ผลลัพธ์สำหรับความแปรปรวนในกลุ่มเฉพาะคุณสามารถแก้ไขพารามิเตอร์
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
ที่เราเพิ่มสองคอลัมน์ลงใน data-frame (จำเป็นเฉพาะเมื่อคุณต้องการประเมิน 'ควบคุม' และ 'ทดลอง' ที่ไม่เกี่ยวข้องกันฟังก์ชัน(0 + condition || participant_id)
จะไม่นำไปสู่การประเมินปัจจัยต่าง ๆ ที่อยู่ในสภาพที่ไม่เกี่ยวข้องกัน)
#adding extra columns for control and experimental
d <- cbind(d,as.numeric(d$condition=='control'))
d <- cbind(d,1-as.numeric(d$condition=='control'))
names(d)[c(4,5)] <- c("control","experimental")
ตอนนี้lmer
จะให้ความแปรปรวนสำหรับกลุ่มที่แตกต่างกัน
> m <- lmer(paste("sim_1 ", fml1), data=d)
> m
Linear mixed model fit by REML ['lmerModLmerTest']
Formula: paste("sim_1 ", fml1)
Data: d
REML criterion at convergence: 2408.186
Random effects:
Groups Name Std.Dev.
participant_id control 0.4963
participant_id.1 experimental 0.4554
Residual 1.0268
Number of obs: 800, groups: participant_id, 40
Fixed Effects:
(Intercept) conditionexperimental
-0.114 0.439
และคุณสามารถใช้วิธีการโปรไฟล์กับสิ่งเหล่านี้ เช่นตอนนี้ confint ให้ช่วงความมั่นใจสำหรับการควบคุมและความแปรปรวน exerimental
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_control|participant_id 0.3490873 0.66714568
sd_experimental|participant_id 0.3106425 0.61975534
sigma 0.9759407 1.08217872
(Intercept) -0.2999382 0.07194076
conditionexperimental 0.1865125 0.69149396
ความง่าย
คุณสามารถใช้ฟังก์ชันความน่าจะเป็นเพื่อรับการเปรียบเทียบขั้นสูงมากขึ้น แต่มีหลายวิธีที่จะทำการประมาณตามถนน (เช่นคุณสามารถทำการทดสอบแบบ anova / lrt-อนุรักษ์นิยม แต่นั่นคือสิ่งที่คุณต้องการหรือไม่?)
ณ จุดนี้มันทำให้ฉันสงสัยว่าจริง ๆ แล้วประเด็นของการเปรียบเทียบระหว่างความแปรปรวน ฉันสงสัยว่ามันเริ่มซับซ้อนเกินไปหรือไม่ ทำไมความแตกต่างระหว่างผลต่างแทนอัตราส่วนระหว่างผลต่าง (ซึ่งเกี่ยวข้องกับการแจกแจงแบบ F คลาสสิก) ทำไมไม่เพียงแค่รายงานช่วงความมั่นใจ? เราจำเป็นต้องย้อนกลับไปก่อนและชี้แจงข้อมูลและเรื่องราวที่ควรจะบอกก่อนที่จะเข้าสู่เส้นทางขั้นสูงที่อาจไม่จำเป็นต้องสัมผัสกับเรื่องทางสถิติและการพิจารณาทางสถิติซึ่งเป็นหัวข้อหลักจริง ๆ
ฉันสงสัยว่าเราควรทำมากกว่าแค่บอกช่วงความมั่นใจ (ซึ่งอาจบอกมากกว่าการทดสอบสมมติฐานจริง ๆ หรือไม่) การทดสอบสมมติฐานให้คำตอบว่าใช่ไม่มีคำตอบ แต่ไม่มีข้อมูลเกี่ยวกับการแพร่กระจายที่แท้จริงของประชากร สร้างความแตกต่างเล็กน้อยที่จะรายงานว่าแตกต่างอย่างมีนัยสำคัญ) การที่จะเจาะลึกลงไปในเรื่องนี้ (ไม่ว่าจะมีวัตถุประสงค์อะไรก็ตาม) ผมเชื่อว่าเป็นคำถามการวิจัยที่เจาะจงมากขึ้น (นิยามแคบ ๆ ) เพื่อเป็นแนวทางในการใช้เครื่องจักรทางคณิตศาสตร์เพื่อทำให้การคำนวณง่ายขึ้น (แม้เมื่อการคำนวณที่แน่นอน มันสามารถประมาณโดยการจำลองสถานการณ์ / bootstrapping แม้ในบางครั้งการตั้งค่าก็ยังต้องมีการตีความที่เหมาะสม) เปรียบเทียบกับการทดสอบที่แน่นอนของฟิชเชอร์เพื่อแก้ปัญหา (โดยเฉพาะ) คำถาม (เกี่ยวกับตารางฉุกเฉิน) อย่างแน่นอน
ตัวอย่างง่ายๆ
เพื่อให้เป็นตัวอย่างของความเรียบง่ายที่เป็นไปได้ฉันแสดงการเปรียบเทียบด้านล่าง (โดยการจำลอง) ด้วยการประเมินอย่างง่ายของความแตกต่างระหว่างความแปรปรวนของกลุ่มสองกลุ่มตามการทดสอบ F ที่กระทำโดยการเปรียบเทียบความแปรปรวนในการตอบสนองเฉลี่ยของแต่ละบุคคล ความแปรปรวนที่ได้จากตัวแบบผสม
J
Y^ฉัน, J∼ N( μJ, σ2J+ σ2ε10)
σεσJj = { 1 , 2 }
คุณสามารถเห็นสิ่งนี้ในการจำลองของกราฟด้านล่างซึ่งกันสำหรับคะแนน F ตามตัวอย่างหมายความว่าคะแนน F ถูกคำนวณตามผลต่างที่ทำนาย (หรือผลรวมของข้อผิดพลาดกำลังสอง) จากแบบจำลอง
σj = 1= σj = 2= 0.5σε= 1
คุณจะเห็นว่ามีความแตกต่างบางอย่าง ความแตกต่างนี้อาจเป็นเพราะความจริงที่ว่าแบบจำลองเชิงเส้นผลกระทบผสมได้รับผลรวมของข้อผิดพลาดกำลังสอง (สำหรับผลแบบสุ่ม) ในวิธีที่แตกต่างกัน และเงื่อนไขข้อผิดพลาดกำลังสองเหล่านี้ไม่ใช่การแสดงออกที่ดีอีกต่อไปเป็นการแจกแจงแบบไคสแควร์อย่างง่าย แต่ก็ยังมีความสัมพันธ์กันอย่างใกล้ชิดและสามารถประมาณได้
σj = 1≠ σj = 2Y^ฉัน, JσJσε
σj = 1= 0.5σj = 2= 0.25σε= 1
ดังนั้นรูปแบบตามค่าเฉลี่ยจึงมีความแม่นยำมาก แต่มันก็มีพลังน้อยกว่า สิ่งนี้แสดงให้เห็นว่ากลยุทธ์ที่ถูกต้องนั้นขึ้นอยู่กับสิ่งที่คุณต้องการ / ต้องการ
ในตัวอย่างข้างต้นเมื่อคุณตั้งค่าขอบเขตหางด้านขวาที่ 2.1 และ 3.1 คุณจะได้รับประมาณ 1% ของประชากรในกรณีที่มีความแปรปรวนเท่ากัน (การตอบสนอง 103 และ 104 จาก 10,000 คดี) แต่ในกรณีของความแปรปรวนที่ไม่เท่ากัน มาก (ให้ 5334 และ 6716 คดี)
รหัส:
set.seed(23432)
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
fml <- "~ condition + (condition | participant_id)"
n <- 10000
theta_m <- matrix(rep(0,n*2),n)
theta_f <- matrix(rep(0,n*2),n)
# initial data frame later changed into d by adding a sixth sim_1 column
ds <- expand.grid(participant_id=1:40, trial_num=1:10)
ds <- rbind(cbind(ds, condition="control"), cbind(ds, condition="experimental"))
#adding extra columns for control and experimental
ds <- cbind(ds,as.numeric(ds$condition=='control'))
ds <- cbind(ds,1-as.numeric(ds$condition=='control'))
names(ds)[c(4,5)] <- c("control","experimental")
# defining variances for the population of individual means
stdevs <- c(0.5,0.5) # c(control,experimental)
pb <- txtProgressBar(title = "progress bar", min = 0,
max = n, style=3)
for (i in 1:n) {
indv_means <- c(rep(0,40)+rnorm(40,0,stdevs[1]),rep(0.5,40)+rnorm(40,0,stdevs[2]))
fill <- indv_means[d[,1]+d[,5]*40]+rnorm(80*10,0,sqrt(1)) #using a different way to make the data because the simulate is not creating independent data in the two groups
#fill <- suppressMessages(simulate(formula(fml),
# newparams=list(beta=c(0, .5),
# theta=c(.5, 0, 0),
# sigma=1),
# family=gaussian,
# newdata=ds))
d <- cbind(ds, fill)
names(d)[6] <- c("sim_1")
m <- lmer(paste("sim_1 ", fml1), data=d)
m
theta_m[i,] <- m@theta^2
imeans <- aggregate(d[, 6], list(d[,c(1)],d[,c(3)]), mean)
theta_f[i,1] <- var(imeans[c(1:40),3])
theta_f[i,2] <- var(imeans[c(41:80),3])
setTxtProgressBar(pb, i)
}
close(pb)
p1 <- hist(theta_f[,1]/theta_f[,2], breaks = seq(0,6,0.06))
fr <- theta_m[,1]/theta_m[,2]
fr <- fr[which(fr<30)]
p2 <- hist(fr, breaks = seq(0,30,0.06))
plot(-100,-100, xlim=c(0,6), ylim=c(0,800),
xlab="F-score", ylab = "counts [n out of 10 000]")
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # means based F-score
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # model based F-score
fr <- seq(0, 4, 0.01)
lines(fr,df(fr,39,39)*n*0.06,col=1)
legend(2, 800, c("means based F-score","mixed regression based F-score"),
fill=c(rgb(0,0,1,1/4),rgb(1,0,0,1/4)),box.col =NA, bg = NA)
legend(2, 760, c("F(39,39) distribution"),
lty=c(1),box.col = NA,bg = NA)
title(expression(paste(sigma[1]==0.5, " , ", sigma[2]==0.5, " and ", sigma[epsilon]==1)))