simr:如何在 lm() 或 aov() 模型中指定预期效果大小?
simr: how to specify expected effect size in lm() or aov() models?
我正在尝试使用 simR
评估简单 GLM 在给定一组试验数据的情况下检测特定效果大小的能力。例如:
library(simr)
m1 = lm(y ~ x, data=simdata)
powerSim(m1)
在测试功效以检测 "observed" 效应量(即试验数据中存在的任何效应量)时,我这样做没有问题,但是我想指定一个 "expected" 效应尺寸。这在处理 LMER
模型时很容易做到,使用 fixef
函数,例如:
m2 = lmer(y ~ x + (1|g), data=simdata)
fixef(m2)['x'] = <expected effect size>
遗憾的是,此功能不适用于 aov()
或 lm()
型号。例如,使用...
fixef(m1)['x'] = <expected effect size>
导致以下错误:
Error in UseMethod("fixef") :
no applicable method for 'fixef' applied to an object of class "c('aov', 'lm')"
是否有另一个 method/package/workaround 我可以用来更改 aov()
或 lm()
的效果大小?我想这可能需要 "hacking" 摘要输出以改变 F 值(对于 aov()
)或系数值(对于 lm()
)的方式,但是我没有任何运气这个工作。
如有任何建议,我们将不胜感激!
编辑
澄清一下,'effect size' 是指模型生成的固定效应系数。所以在下面的输出中:
# Call:
# lm(formula = y ~ x, data = simdata)
# Coefficients:
# (Intercept) x
# 10.6734 -0.2398
x
的'effect size'是-0.2398。在功效分析的背景下,改变效果大小应该直接影响统计功效(因为大效果需要更少的功效来检测,反之亦然)。例如,当使用 LMER 时,用 fixef()
改变效应量直接影响统计功效:
m2 = lmer(y ~ x + (1|g), data=simdata)
summary(powerSim(m2, progress=F, nsim=100)
# successes trials mean lower upper
# 1 96 100 0.96 0.9007428 0.9889955
指定较小的效应值并重新评估功效:
fixef(m2)['x'] = 0.05
summary(powerSim(m2, progress=F, nsim=100)
# successes trials mean lower upper
# 1 12 100 0.12 0.0635689 0.2002357
我尝试使用以下方法修改 lm()
的系数值:
m1 = lm(y ~ x, data=simdata)
m1$coefficients['x'] = <expected effect size>
但是这对功率没有影响,例如当将系数从 0.9 更改为 0.09
m1$coefficients['x'] = 0.9
summary(powerSim(m1, progress=F, nsim=100))
# successes trials mean lower upper
# 1 22 100 0.22 0.1433036 0.3139197
m1$coefficients['x'] = 0.09
summary(powerSim(m1, progress=F, nsim=100))
# successes trials mean lower upper
# 1 24 100 0.24 0.1602246 0.3357355
所以我想我的问题更准确的措辞是:如何以反映统计功效变化的方式更改 aov()
/lm()
模型的效应大小?
最简单的解决方案是完全避免使用 powerSim
,而是使用包 pwr 中的 pwr.f2.test
。在给定特定模型参数和预期效果大小的情况下,这提供了精确的功效测量(与模拟功效相反)。
m1 = lm(y ~ x, data=simdata)
anova(m1)
# Analysis of Variance Table
#
# Response: y
# Df Sum Sq Mean Sq F value Pr(>F)
# x 1 14.231 14.2308 1.5943 0.2171
# Residuals 28 249.925 8.9259
将 anova(m1)
中的 df 值用于 u
和 v
参数 pwr.f.test
pwr.f2.test(u=1, v=28, f2=<expected effect size>)
感谢@StupidWolf 解决了这个问题!
您需要使用:
coef(m1)['x'] = <expected effect size>
而不是
fixef(m1)['x'] = <expected effect size>
我正在尝试使用 simR
评估简单 GLM 在给定一组试验数据的情况下检测特定效果大小的能力。例如:
library(simr)
m1 = lm(y ~ x, data=simdata)
powerSim(m1)
在测试功效以检测 "observed" 效应量(即试验数据中存在的任何效应量)时,我这样做没有问题,但是我想指定一个 "expected" 效应尺寸。这在处理 LMER
模型时很容易做到,使用 fixef
函数,例如:
m2 = lmer(y ~ x + (1|g), data=simdata)
fixef(m2)['x'] = <expected effect size>
遗憾的是,此功能不适用于 aov()
或 lm()
型号。例如,使用...
fixef(m1)['x'] = <expected effect size>
导致以下错误:
Error in UseMethod("fixef") :
no applicable method for 'fixef' applied to an object of class "c('aov', 'lm')"
是否有另一个 method/package/workaround 我可以用来更改 aov()
或 lm()
的效果大小?我想这可能需要 "hacking" 摘要输出以改变 F 值(对于 aov()
)或系数值(对于 lm()
)的方式,但是我没有任何运气这个工作。
如有任何建议,我们将不胜感激!
编辑
澄清一下,'effect size' 是指模型生成的固定效应系数。所以在下面的输出中:
# Call:
# lm(formula = y ~ x, data = simdata)
# Coefficients:
# (Intercept) x
# 10.6734 -0.2398
x
的'effect size'是-0.2398。在功效分析的背景下,改变效果大小应该直接影响统计功效(因为大效果需要更少的功效来检测,反之亦然)。例如,当使用 LMER 时,用 fixef()
改变效应量直接影响统计功效:
m2 = lmer(y ~ x + (1|g), data=simdata)
summary(powerSim(m2, progress=F, nsim=100)
# successes trials mean lower upper
# 1 96 100 0.96 0.9007428 0.9889955
指定较小的效应值并重新评估功效:
fixef(m2)['x'] = 0.05
summary(powerSim(m2, progress=F, nsim=100)
# successes trials mean lower upper
# 1 12 100 0.12 0.0635689 0.2002357
我尝试使用以下方法修改 lm()
的系数值:
m1 = lm(y ~ x, data=simdata)
m1$coefficients['x'] = <expected effect size>
但是这对功率没有影响,例如当将系数从 0.9 更改为 0.09
m1$coefficients['x'] = 0.9
summary(powerSim(m1, progress=F, nsim=100))
# successes trials mean lower upper
# 1 22 100 0.22 0.1433036 0.3139197
m1$coefficients['x'] = 0.09
summary(powerSim(m1, progress=F, nsim=100))
# successes trials mean lower upper
# 1 24 100 0.24 0.1602246 0.3357355
所以我想我的问题更准确的措辞是:如何以反映统计功效变化的方式更改 aov()
/lm()
模型的效应大小?
最简单的解决方案是完全避免使用 powerSim
,而是使用包 pwr 中的 pwr.f2.test
。在给定特定模型参数和预期效果大小的情况下,这提供了精确的功效测量(与模拟功效相反)。
m1 = lm(y ~ x, data=simdata)
anova(m1)
# Analysis of Variance Table
#
# Response: y
# Df Sum Sq Mean Sq F value Pr(>F)
# x 1 14.231 14.2308 1.5943 0.2171
# Residuals 28 249.925 8.9259
将 anova(m1)
中的 df 值用于 u
和 v
参数 pwr.f.test
pwr.f2.test(u=1, v=28, f2=<expected effect size>)
感谢@StupidWolf 解决了这个问题!
您需要使用:
coef(m1)['x'] = <expected effect size>
而不是
fixef(m1)['x'] = <expected effect size>