序数逻辑回归的功效分析


Answers:


27

我更喜欢通过模拟进行基础以外的功率分析。对于预装的软件包,我永远不确定要进行什么假设。

使用R进行功率仿真非常简单(且负担得起)。

  1. 决定您认为数据的外观以及如何分析数据
  2. 编写一个函数或一组表达式,它们将模拟给定关系和样本量的数据并进行分析(最好使用一个函数,因为您可以将样本量和参数设置为参数,以便更轻松地尝试不同的值)。函数或代码应返回p值或其他测试统计信息。
  3. 使用replicate函数从一堆以上运行代码(我通常从大约100次开始,以了解所需的时间并获得正确的常规区域,然后增加到1,000,有时甚至达到10,000或100,000我将使用的最终值)。您拒绝原假设的时间比例就是功效。
  4. 重做上面的另一组条件。

这是一个具有序数回归的简单示例:

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 )

6
NNN

2
@gung:您的评论很有道理,您是否愿意添加代码,以便经验不足的R人也可以从中受益?谢谢

1
我再看一次,有几个问题:1)为什么x在1:10上均匀?2)您如何将其概括为多个自变量?
彼得·弗洛姆-恢复莫妮卡

1
@ PeterFlom,x必须是某物,所以我(任意)选择使它在0到10之间均匀,它也可能是正常的,伽玛等。最好是选择与我们期望的真实值相似的东西x变量看起来像。要使用多个预测变量,请独立生成它们(或从多元法线,copula等生成),然后将它们全部包含在eta1中,例如eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3
格雷格·斯诺

1
replicatemeanα=0.05

3

我会在Sno​​w的答案中添加另一件事(这适用于通过模拟进行的任何功率分析)-请注意您是在寻找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值减半。


2

除了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%。不太令人鼓舞。

(如果我的模拟方法不对,请告诉我。我将发表几篇医学论文,讨论用于计划临床试验的功率模拟,但我不确定确切的实现方法。)


0

参考第一个模拟(由Snow建议;https://stats.stackexchange.com/a/22410/231675):

我仍然不确定带有更多(特别是三个)自变量的模拟情况如何。我知道我应该“将它们全部包含在eta1中,例如eta1 <-beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3”(如上所述)。但是我不知道如何调整函数中的其余参数。有人可以帮我这个忙吗?


1
我想如果您提出一个新问题并返回该问题的链接,将会得到更好的答复。
mdewey
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.