单变量逻辑回归的样本量计算

机器算法验证 物流 样本量
2022-03-06 01:03:54

如何计算一项研究所需的样本量,其中一组受试者将在手术时测量一个连续变量,然后在两年后将它们分类为功能性结果或受损结果。

我们想看看该测量是否可以预测不良结果。在某些时候,我们可能希望在连续变量中得出一个切点,在该切点之上我们将尝试进行干预以减少受损结果的概率。

有任何想法吗?任何 R 实现。

4个回答

逻辑回归的样本量计算很复杂。我不会试图在这里总结它。此问题的合理可访问解决方案可在以下位置找到:

谢风云。逻辑回归的样本量表。医学统计学。1989 年 7 月;8(7):795-802。

谢风云等。一种简单的线性和逻辑回归样本量计算方法。医学统计学。1998 年 7 月 30 日;17(14):1623-34。

在 Hosmer & Lemeshow 的Applied Logistic Regression的最后一章(第 8.5 节 pp 339-347)中可以找到关于示例计算问题的易于理解的讨论

我通常发现运行模拟更容易、更快。论文需要很长时间才能阅读、理解并最终得出结论,即它们不适用于人们感兴趣的特殊情况。

因此,我会选择一些主题,模拟您感兴趣的协变量(按您认为的方式分布),根据您提出的函数形式模拟好/坏结果(协变量的阈值效应?非线性?)使用您想要检测的最小(临床上)显着效应大小,通过分析运行结果并查看是否在您的 alpha 中发现了效应。重新运行 10,000 次,看看您是否在 80% 的模拟中找到了效果(或者您需要的任何其他功能)。调整主题的数量,重复,直到你有一个你满意的力量。

这具有非常通用的优点,因此您不限于特定的函数形式或特定数量或分布的协变量。您可以随机包含辍学或受协变量或结果的影响,请参阅上面 chl 的评论。您基本上事先对最终样本的分析进行了编码,这有时有助于将我的思想集中在研究设计上。它很容易在 R 中完成(矢量化!)。

继 Stephan Kolassa 的帖子之后(我无法将其添加为评论),我有一些用于模拟的替代代码。这使用了相同的基本结构,但被分解了更多,所以可能更容易阅读。它还基于Kleinman 和 Horton的代码来模拟逻辑回归。

nn 是样本中的数字。协变量应该是连续正态分布的,并标准化为均值 0 和 sd 1。我们使用 rnorm(nn) 来生成它。我们选择一个优势比并将其存储在odds.ratio 中。我们还为拦截选择了一个数字。这个数字的选择决定了样本经历“事件”的比例(例如,0.1、0.4、0.5)。你必须玩弄这个数字,直到你得到正确的比例。以下代码为您提供了 0.1 的比例,样本大小为 950,OR 为 1.5:

nn <- 950
runs <- 10000
intercept <- log(9)
odds.ratio <- 1.5
beta <- log(odds.ratio)
proportion  <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  prop <- length(which(ytest <= 0.5))/length(ytest)
                  }
            )
summary(proportion)

summary(proportion) 确认比例为 ~ 0.1

然后使用相同的变量,计算 10000 次运行的功效:

result <-  replicate(
              n = runs,
              expr = {
                  xtest <- rnorm(nn)
                  linpred <- intercept + (xtest * beta)
                  prob <- exp(linpred)/(1 + exp(linpred))
                  runis <- runif(length(xtest),0,1)
                  ytest <- ifelse(runis < prob,1,0)
                  summary(model <- glm(ytest ~ xtest,  family = "binomial"))$coefficients[2,4] < .05
                  }
            )
print(sum(result)/runs)

我认为这段代码是正确的——我对照 Hsieh, 1998 中给出的例子(表 2)检查了它,它似乎与那里给出的三个例子一致。我还针对 Hosmer 和 Lemeshow 的第 342 - 343 页上的示例对其进行了测试,发现它的功效为 0.75(与 Hosmer 和 Lemeshow 中的 0.8 相比)。因此,在某些情况下,这种方法可能低估了力量。但是,当我在这个在线计算器中运行相同的示例时,我发现它与我的一致,而不是 Hosmer 和 Lemeshow 中的结果。

如果有人能告诉我们为什么会这样,我很想知道。

关于样本量的一个简单问题是:对于数据分布的 [未知] 均值,需要多大的样本才能获得不超过 2d 的 95% 置信区间。另一个变体是:在测试 H时,需要多大的样本才能在处具有 0.9 的功效。您似乎没有指定任何选择样本量的标准。θ=10:θ=0

实际上,听起来您的学习将按顺序进行。在这种情况下,将其作为实验的明确部分可能是值得的。顺序抽样通常比固定样本量的实验更有效[平均需要更少的观察]。

Farrel:我添加这个是为了回复你的评论。

为了获得样本量,通常为估计值指定某种精度标准 [例如 CI 的长度] 或在要对数据执行的指定替代测试的功率。您似乎提到了这两个标准。原则上这并没有错:您只需要进行两次样本量计算 - 一个是为了达到所需的估计精度 - 而另一个是为了在指定的替代方案下获得所需的功率。那么需要两个样本量中较大的一个。[顺便说一句 - 除了说 80% 的功率 - 你似乎没有提到你计划执行的测试 - 或者你想要 80% 的功率的替代方案。]

至于使用顺序分析:如果受试者同时参加研究,那么固定样本量是有意义的。但是,如果科目很少而且相距甚远,则可能需要一两年[或更长时间]才能获得所需的注册人数。因此,审判可能会持续三年或四年[或更长时间]。在这种情况下,顺序方案提供了比这更早停止的可能性 - 如果您正在寻找的效果在试验的早期变得具有统计学意义。