我正在寻找一个程序(R或SAS或独立的,如果免费或低成本的话),它将对有序逻辑回归进行功率分析。
我正在寻找一个程序(R或SAS或独立的,如果免费或低成本的话),它将对有序逻辑回归进行功率分析。
Answers:
我更喜欢通过模拟进行基础以外的功率分析。对于预装的软件包,我永远不确定要进行什么假设。
使用R进行功率仿真非常简单(且负担得起)。
replicate
函数从一堆以上运行代码(我通常从大约100次开始,以了解所需的时间并获得正确的常规区域,然后增加到1,000,有时甚至达到10,000或100,000我将使用的最终值)。您拒绝原假设的时间比例就是功效。这是一个具有序数回归的简单示例:
library(rms)
tmpfun <- function(n, beta0, beta1, beta2) {
x <- runif(n, 0, 10)
eta1 <- beta0 + beta1*x
eta2 <- eta1 + beta2
p1 <- exp(eta1)/(1+exp(eta1))
p2 <- exp(eta2)/(1+exp(eta2))
tmp <- runif(n)
y <- (tmp < p1) + (tmp < p2)
fit <- lrm(y~x)
fit$stats[5]
}
out <- replicate(1000, tmpfun(100, -1/2, 1/4, 1/4))
mean( out < 0.05 )
eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3
。
我会在Snow的答案中添加另一件事(这适用于通过模拟进行的任何功率分析)-请注意您是在寻找1尾测试还是2尾测试。流行的程序(例如G * Power)默认为1尾测试,并且如果您尝试查看模拟是否与它们匹配(在学习如何进行模拟时总是一个好主意),则需要先进行检查。
为了使Snow进行1尾测试,我将在函数输入中添加一个称为“ tail”的参数,并将以下内容放入函数本身:
#two-tail test
if (tail==2) fit$stats[5]
#one-tail test
if (tail==1){
if (fit$coefficients[5]>0) {
fit$stats[5]/2
} else 1
1尾版本基本上检查系数是否为正,然后将p值减半。
除了Snow的出色示例外,我相信您也可以通过对影响您的现有数据集进行重采样来进行功耗模拟。这不是一个引导程序,因为您不是要对相同的n而是相同的想法进行替换采样。
因此,这里有一个例子:我进行了一些自我实验,得出了正的点估计值,但是由于它很少,因此在序数逻辑回归中几乎没有统计学意义。根据该点估计,我需要多大的n?对于各种可能的n,我很多次生成数据集并运行有序逻辑回归并查看p值有多小:
library(boot)
library(rms)
npt <- read.csv("http://www.gwern.net/docs/nootropics/2013-gwern-noopept.csv")
newNoopeptPower <- function(dt, indices) {
d <- dt[sample(nrow(dt), n, replace=TRUE), ] # new dataset, possibly larger than the original
lmodel <- lrm(MP ~ Noopept + Magtein, data = d)
return(anova(lmodel)[7])
}
alpha <- 0.05
for (n in seq(from = 300, to = 600, by = 30)) {
bs <- boot(data=npt, statistic=newNoopeptPower, R=10000, parallel="multicore", ncpus=4)
print(c(n, sum(bs$t<=alpha)/length(bs$t)))
}
随着输出(对我而言):
[1] 300.0000 0.1823
[1] 330.0000 0.1925
[1] 360.0000 0.2083
[1] 390.0000 0.2143
[1] 420.0000 0.2318
[1] 450.0000 0.2462
[1] 480.000 0.258
[1] 510.0000 0.2825
[1] 540.0000 0.2855
[1] 570.0000 0.3184
[1] 600.0000 0.3175
在这种情况下,在n = 600时,功率为32%。不太令人鼓舞。
(如果我的模拟方法不对,请告诉我。我将发表几篇医学论文,讨论用于计划临床试验的功率模拟,但我不确定确切的实现方法。)
参考第一个模拟(由Snow建议;https://stats.stackexchange.com/a/22410/231675):
我仍然不确定带有更多(特别是三个)自变量的模拟情况如何。我知道我应该“将它们全部包含在eta1中,例如eta1 <-beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3”(如上所述)。但是我不知道如何调整函数中的其余参数。有人可以帮我这个忙吗?