R中交互项的幂

机器算法验证 r 回归 相互作用 统计能力
2022-03-18 05:12:56

我用线性回归模型分析了一个数据集,包括二元变量和连续变量之间的交互项。相互作用是显着的。之后,我为两组二元变量中的每组拟合了 2 个独立的连续变量模型。两个斜率具有不同的符号,两个斜率之一是显着的。

我需要计算这种交互的重要性的力量。我更喜欢用 R 函数来做到这一点。

2个回答

我不认为有一个 R 函数来计算这个功率。在这种情况下,我通常的建议是模拟(例如,此处此处此处)。具体来说,选择样本量n,模拟您的协变量、二元变量、结果对两者的依赖性以及噪声。拟合您的模型并评估是否p<α. 多次这样做,看看您多久检测一次显着效果。如果要确定达到目标功效所需的样本量,请更改n直到你达到你想要的力量。

是的,这意味着您必须考虑许多假设(例如,您的 IV 的分布,它们是否独立,线性是否有意义,您的错误是否真的是同方差的,...)。我认为这是一个功能,而不是一个错误。与找到现成的功率计算器相比,您肯定会对您的问题有更多的了解,并且最好在学习之前获得这种理解而不是之后

(您是在进行研究之前询问样本量的确定,对吗?所谓的“事后权力”是没有意义的。)

另一个优点是这种方法的灵活性允许您改变假设并分析功率是否下降。或者您可以模拟其他数据问题,例如丢失数据等。

这是一些非常简单的 R 代码,我假设n=50,随机 50-50 的组成员,独立于组成员的均匀分布协变量,以及结果

y=covariate+groupscovariate+ϵ

ϵN(0,1). 在这种情况下,功率为 0.166。如果你想要标准β=0.80, 你可以增加n或更改您的模型假设 - 并考虑更改后的假设是否有意义。

n_sims <- 1000

nn <- 50
alpha <- 0.05
result <- rep(FALSE,n_sims)
pb <- winProgressBar(max=n_sims)
for ( ii in 1:n_sims ) {
    setWinProgressBar(pb,ii,paste(ii,"of",n_sims))
    set.seed(ii)    # for reproducibility

    # this is where the assumptions enter
    covariate <- runif(nn)
    groups <- runif(nn)<0.5
    outcome <- covariate+groups*covariate+rnorm(nn,1)

    # fit the model, determine whether an effect was found
    model <- lm(outcome~groups*covariate)
    p_value <- anova(model,update(model,.~.-groups:covariate))[2,6]
    result[ii] <- p_value<alpha
}
close(pb)

sum(result)/n_sims

R 包 InteractionPoweR可以对这种回归进行功效分析。

install.packages("devtools")
devtools::install_github("dbaranger/InteractionPoweR")
library(InteractionPoweR)

test_power<-power_interaction(
  n.iter = 1000,            # number of simulations per unique combination of input parameters
  alpha = 0.05,             # alpha, for the power analysis
  N = 350,                  # sample size
  r.x1x2.y = .15,           # interaction effect to test (correlation between x1*x2 and y)
  r.x1.y = .2,              # correlation between x1 and y
  r.x2.y = .1,              # correlation between x2 and y
  r.x1.x2 = .2,             # correlation between x1 and x2
  k.x1 = 2,                 # x1 is binary
  seed = 581827             # seed, for reproducibility
  adjust.correlations = TRUE)     # Adjust correlations