simr中powerCurve无错误但length效应成功率极低的排查咨询
使用simr进行功效分析时length效应功效异常的排查方案
问题背景
基于过往迫选任务实验数据(answer取值0/1,项目采用2×2拉丁方设计分配给被试),使用simr工具开展新实验的功效分析,拟合模型代码如下:
library("simr") df1 <- read.csv("EnglishData.csv") lm_4.2 <- glmer(answer~length*position + (1|participant) + (1|set), data = df1, family = binomial)
模拟被试数量增加时固定效应及交互项的功效,简化后的代码示例:
model_extended <- extend(lm_4.2, along="participant", n = 200) # 扩展至200名被试 # Length效应 p_curveLenght <- powerCurve(model_extended , test=fixed("lengths", "z"), nsim = 10, along="participant", breaks = seq(from = 50, to = 200, by = 50)) summary(p_curveLenght ) print(p_curveLenght) plot(p_curveLenght ) # Position效应 p_curvePos <- powerCurve(model_extended , test=fixed("positions", "z"), nsim = 10, along="participant", breaks = seq(from = 50, to = 200, by = 50)) summary(p_curvePos) print(p_curvePos) plot(p_curvePos) # 交互项 p_curveEX <- powerCurve(model_extended , test=fixed("lengths:positions", "z"), nsim = 10, along="participant", breaks = seq(from = 50, to = 300, by = 50)) summary(p_curveEX) print(p_curveEX) plot(p_curveEX)
异常表现
length效应的模拟功效不升反降,即使被试数增至8000也无改善:
#FirstPredictor > print(p_curveLenght) Power for predictor 'lengths', (95% confidence interval), by largest value of participant: 50: 0.00% ( 0.00, 30.85) - 1542 rows 100: 20.00% ( 2.52, 55.61) - 3084 rows 150: 10.00% ( 0.25, 44.50) - 4626 rows 200: 10.00% ( 0.25, 44.50) - 6168 rows
summary显示各断点成功率极低,但模型无错误或警告:
> summary(p_curveLenght) nrow nlevels successes trials mean lower upper 1 1542 50 0 10 0.0 0.000000000 0.3084971 2 3084 100 2 10 0.2 0.025210726 0.5560955 3 4626 150 1 10 0.1 0.002528579 0.4450161 4 6168 200 1 10 0.1 0.002528579 0.4450161 > p_curveLenght$errors [1] stage index message <0 rows> (or 0-length row.names) > p_curveLenght$warnings [1] stage index message <0 rows> (or 0-length row.names)
position效应和交互项的模拟结果符合预期:
#Second Predictor > p_curvePos Power for predictor 'positions', (95% confidence interval), by largest value of participant: 50: 30.00% ( 6.67, 65.25) - 1542 rows 100: 60.00% (26.24, 87.84) - 3084 rows 150: 70.00% (34.75, 93.33) - 4626 rows 200: 90.00% (55.50, 99.75) - 6168 rows > print(p_curveEX) Power for predictor 'lengths:positions', (95% confidence interval), by largest value of participant: 50: 30.00% ( 6.67, 65.25) - 1542 rows 100: 60.00% (26.24, 87.84) - 3084 rows 150: 80.00% (44.39, 97.48) - 4626 rows 200: 90.00% (55.50, 99.75) - 6168 rows
排查与验证方案
一、length效应低成功率的排查步骤
核对变量名一致性
- 模型公式中使用的是
length,但powerCurve测试语句写的是fixed("lengths", "z"),运行colnames(df1)或levels(df1$length)确认变量真实名称,避免单数/复数拼写错误导致测试不存在的效应。
- 模型公式中使用的是
评估原模型中length效应的强度
- 运行
summary(lm_4.2),查看length的固定效应系数、标准误和p值:- 如果原数据中length效应本身极小(系数接近0,p值远大于0.05),说明该效应真实强度极弱,即使增加被试数也难以检测到显著结果。
- 对比position和交互项的效应大小,确认length是否确实远弱于其他效应。
- 运行
手动模拟单轮数据验证
- 生成单轮模拟数据并手动拟合模型,观察length效应的表现:
sim_data <- simulate(lm_4.2, nsim=1)[[1]] sim_model <- glmer(sim_data~length*position + (1|participant) + (1|set), data=df1, family=binomial) summary(sim_model) - 重复多次该操作,若length效应始终无法显著,说明原模型中的效应强度不足以支撑检测。
- 生成单轮模拟数据并手动拟合模型,观察length效应的表现:
检查扩展数据集结构
- 运行
str(model_extended@frame)查看扩展后的数据,确认length变量的分布是否保持原数据的2×2拉丁方平衡设计。extend()默认复制原被试结构,若原数据中length分布不平衡,扩展后可能加剧该问题,导致效应难以检测。
- 运行
调整模拟参数
- 增加
nsim数量(如增至100),减少随机波动对结果的影响(当前nsim=10的结果置信区间过宽,可靠性不足)。 - 改用似然比检验
test=fixed("length", "lr")代替z检验,Wald z检验在效应弱或样本结构特殊时可能不稳定。
- 增加
二、验证模拟设置的正确性
确认extend参数逻辑
- 运行
length(unique(df1$participant))查看原模型的被试数,确认extend(lm_4.2, along="participant", n = 200)中的n是扩展后的总被试数,若原被试数已达200,该扩展操作无意义。
- 运行
检查测试语句语法
- 若
length是二分类变量,测试语句可简化为fixed("length"),无需额外指定"z"参数;确认fixed()函数的参数是否符合simr的语法要求。
- 若
验证随机效应结构
- 查看
summary(lm_4.2)中set变量的随机效应方差,若该方差极大,可能掩盖length的固定效应,可考虑调整模型结构(如去掉(1|set)后重新模拟,看结果是否变化)。
- 查看
三、判断是否为数据本身特性
若经过以上排查,变量名无错误、原模型中length效应确实极弱、手动模拟也无法得到显著结果,则这种低功效属于数据本身特性:即length对answer的影响过小,仅增加被试数无法有效提升检测效力。此时需重新设计实验(如增加每个被试完成的项目数),或评估该效应的研究价值。
内容的提问来源于stack exchange,提问作者Any
相关产品推荐
相关产品推荐

