他们写了一个R包{InteractionPoweR},同时还发了一篇13.6分的论文!

学术   科学   2024-03-11 13:49   浙江  
小编最近看了一篇论文[1]

作者们开发了一个R包,名为{InteractionPoweR},可用于计算交互回归模型的样本量和统计功效。

如果一个回归模型含有一个交互项,它可以使用下方的公式表示:


其中Y为因变量,X1和X2为自变量,X1X2为交互项,βs为回归系数。

这个R包希望通过统计功效分析来解决以下问题:在预设的显著性水平 (α,即p值) 下,该分析方法具有多少统计功效来检测交互项回归系数 β3 是否存在显著差异。

下面直接进入主题!

下载和安装R包,代码如下:

install.packages("InteractionPoweR")
library(InteractionPoweR)
R包get!

这个R包的使用最少要涉及到五个参数,分别如下: 

N:样本量
r.x1.y: x1和y的相关系数
r.x2.y:  x2和y的相关系数
r.x1.x2: x1和x2的相关系数
r.x1x2.y: 交互项x1x2和y的相关系数

先创建一个模拟的数据,即包含两个自变量和一个交互项的回归模型的数据集,代码如下: 

set.seed(123)
mydata <- generate_interaction(N = 200,
                               r.x1.y = 0.18
# x1和y的相关系数
                               r.x2.y = 0.11,
                               r.x1.x2 = 0.19,
                               r.x1x2.y = 0.2)

head(mydata)

数据比较抽象,可以直接使用一个函数进行作图,代码如下:

plot_interaction(data = mydata,
                 q = 2)   # 简单斜率的数量,默认为2

下一步,可以查看回归模型的结果,代码如下:

test_interaction(data = mydata,
                 q = 2)

数据已经创建完毕,下面做一个简单的统计效能分析。

假设样本量以及其他的相关参数全部已知,α值设在0.05(这个R包的默认情况),如何计算统计功效? 代码如下:

power_interaction_r2(N = 200,
                     r.x1.y = 0.18,
                     r.x2.y = 0.11,
                     r.x1.x2 = 0.19,
                     r.x1x2.y = 0.2,
                     alpha = 0.05)

统计功效为81%! 

或者也可以使用这个R包的另外一个函数,它使用蒙特卡罗模拟来计算统计功效,代码如下: 

set.seed(321)   # 为了让结果可以重复
power_interaction(n.iter = 1500, # 模拟的次数;这里是为了节省时间,原文作者推荐10000
                  alpha = 0.05,
                  N = 200,
                  r.x1.y = 0.18,
                  r.x2.y = 0.11,
                  r.x1.x2 = 0.19,
                  r.x1x2.y = 0.2)

结果为80.6%!

下一步,稍微提升一下难度。现在假设样本量未知,需要解决的问题是找到那个最佳的样本量从而让统计功效达到一定的值,比如0.8或0.9,那该怎么做?代码如下: 

power_test0 <- power_interaction_r2(N = seq(100, 360, by = 10),
                                    r.x1.y = 0.18,
                                    r.x2.y = 0.11,
                                    r.x1.x2 = 0.19,
                                    r.x1x2.y = 0.2,
                                    alpha = 0.05)
power_test0

从代码中可知,我们给N设置了一个范围,再分别计算出所对应的统计功效。从上面的结果可以找到样本量所对应的统计功效。 

可以选择将上面的数据进行作图,查看统计功效为0.8所对应的样本量,代码如下: 

plot_power_curve(power_data = power_test0,
                 power_target = 0.8)
# 默认

图中的那条水平线指的是统计功效=0.8,和曲线交叉点所对于x轴上的值就是要找的样本量,接近200。

如果将统计功效的水平调高到0.9,同样可以画出曲线,代码如下: 

plot_power_curve(power_data = power_test0,
                 power_target = 0.9)  

通过肉眼观察,交叉点所对应的样本量大概在260左右。

因为上面的数值范围是间隔10个样本,假设现在希望更加的精确,比如精确到1个样本,那该怎么做?代码如下:

power_test1 <- power_interaction_r2(N = seq(250, 270, by = 1),
                                     r.x1.y = 0.18,
                                     r.x2.y = 0.11,
                                     r.x1.x2 = 0.19,
                                     r.x1x2.y = 0.2,
                                     alpha = 0.05)
power_test1 

从上面的数据中可知,如果希望统计功效达到0.9,所需的样本量为258。

下一步,继续增加难度,假设现在有两个参数未知,以样本量和[交互项与因变量的效应量(相关系数)]为例。

也是通过扩大范围进行搜索,代码如下:

power_test2 <- power_interaction_r2(N = seq(100, 360, by = 10),
                                    r.x1.y = 0.18,
                                    r.x2.y = 0.11,
                                    r.x1.x2 = 0.19,
                                    r.x1x2.y = seq(0.16, 0.21, by = 0.005),
                                    alpha = 0.05)

plot_power_curve(power_data = power_test2,
                 power_target = 0.8,
                 x = "N",
                 group = "r.x1x2.y")

上图相当于是将交互项与因变量的效应量(相关系数)按照数值进行分组,再画出对应的样本量和统计功效的关系图。

原文作者建议未知变量个数最多不超过3个。

最后,再举一个例子,这个R包还可以将变量的信度(reliability)考虑在内。因为作者认为,如果变量的测量不可靠,那显然会影响统计功效的计算。

下面的代码可以让3个变量具备不同的信度,从而可以观察信度对统计功效分析的影响,代码如下:

power_test3 <- power_interaction_r2(N = 200,
                                   r.x1.y = 0.18,
                                   r.x2.y = 0.11,
                                   r.x1.x2 = 0.19,
                                   r.x1x2.y = 0.2,
                                   alpha = 0.05,
                                   rel.x1 = seq(0.3,1,by= 0.1),
                                   rel.x2 = seq(0.3,1,by= 0.1),
                                   rel.y = seq(0.3,1,by= 0.2))

plot_power_curve(power_data = power_test3,
                 power_target = 0.8,
                 x = "rel.x1",
                 group = "rel.x2",
                 facets= "rel.y")

对于希望继续深入了解这个内容的读者,可以查看下方的参考文献,或者参考原文中提供的文献,如下表: 

文献[1] Table 2


好啦,今天的内容就到这里。如果有帮助,记得分享给需要的人


参考文献

[1] Power Analyses for Interaction Effects in Cross-Sectional Regressions

公众号的线上课程
1. 《R语言和统计新手课程》
2. 《回归:从入门到进阶》

统计咨询
《服务介绍和经典合作案例》

公众号核心成员的成果发表
《SCI医学1区影响因子9分论文》

公众号核心成员担任SCI杂志Associate Editor!
《JAD杂志Associate editor》
《Frontiers in Neuroscience, Frontiers in Neurology and Frontiers in Psychiatry杂志的神经退行性病变板块》


▌本文由R语言和统计首发
▌课程相关咨询可添加R师妹微信: kefu_rstats
▌编辑:June
▌邮箱:contact@rstats.cn
▌网站:www.rstats.cn
我们致力于让R语言和统计变得简单!





R语言和统计
我们定期更新与R有关的内容,比如R编程基础,作图,实用R包的解读,统计学基础知识,前沿的统计方法,机器学习等等。
 最新文章