Я ищу программу (в R или SAS или автономную, если бесплатно или по низкой цене), которая будет выполнять анализ мощности для порядковой логистической регрессии.
Я ищу программу (в R или SAS или автономную, если бесплатно или по низкой цене), которая будет выполнять анализ мощности для порядковой логистической регрессии.
Ответы:
Я предпочитаю проводить силовой анализ за рамками моделирования. С предварительно упакованными пакетами я никогда не совсем уверен, какие предположения делаются.
Имитация мощности довольно проста (и доступна) с использованием R.
replicate
функцию для запуска кода сверху несколько раз (обычно я начинаю примерно со 100 раз, чтобы понять, сколько времени это занимает, и получить правильную общую область, затем до 1000, а иногда и 10000 или 100000 для окончательные значения, которые я буду использовать). Доля раз, когда вы отвергли нулевую гипотезу, является силой.Вот простой пример с порядковой регрессией:
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
.
Я бы добавил еще одну вещь к ответу Сноу (и это относится к любому анализу мощности с помощью симуляции) - обратите внимание на то, ищете ли вы 1 или 2 хвостатых теста. В популярных программах, таких как G * Power, по умолчанию используется односторонний тест, и если вы пытаетесь проверить, соответствуют ли им симуляции (это всегда хорошая идея, когда вы изучаете, как это сделать), вам следует сначала проверить это.
Чтобы Сноу выполнял односторонний тест, я бы добавил параметр «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 пополам.
Помимо отличного примера Сноу, я полагаю, что вы также можете выполнить имитацию мощности путем повторной выборки из существующего набора данных, который имеет свой эффект. Не совсем самозагрузки, так как вы не выборки-с-заменой той же п , но та же идея.
Итак, вот пример: я провел небольшой самоэксперимент, который привел к положительной точечной оценке, но, поскольку он был небольшим, не был почти статистически значимым в порядковой логистической регрессии. С этой точной оценкой, какой большой 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; /stats//a/22410/231675 ):
Я до сих пор не уверен, как должно выглядеть моделирование с более (в частности, тремя) независимыми переменными. Я понимаю, что должен «включить их всех в часть eta1, например, eta1 <- beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3» (как упоминалось выше). Но я не знаю, как настроить остальные параметры в функции. Может ли кто-нибудь помочь мне с этим?