Аналіз потужності для порядкової логістичної регресії


Відповіді:


27

Я вважаю за краще робити аналіз потужності поза межами основ шляхом моделювання. Що стосується попередньо замовлених пакетів, я ніколи не впевнений, які припущення робляться.

Моделювання сили досить прямо (і доступно) за допомогою Р.

  1. вирішіть, як ви вважаєте, як мають виглядати ваші дані та як ви їх будете аналізувати
  2. написати функцію або набір виразів, які змоделюють дані для заданого співвідношення та розміру вибірки, і зробіть аналіз (функція є кращою, оскільки ви можете зробити розмір та параметри вибірки в аргументи, щоб спростити спробу різних значень). Функція або код повинен повернути значення p або іншу тестову статистику.
  3. використовуйте replicateфункцію, щоб запустити код зверху кілька разів (я зазвичай починаю приблизно в 100 разів, щоб відчути, скільки часу займає, і отримати потрібну загальну площу, а потім до 1000, а іноді і 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
+1, це дуже надійний, універсальний підхід. Я часто його використовував. Я хочу запропонувати ще одну особливість: Ви можете генерувати дані для максимуму ви вважаєте, а потім підходити до моделі для пропорцій цих даних, послідовно встановлюючи 1-й n з них через регулярні інтервали до (наприклад, n = 100 , 120, 140, 160, 180 і 200). Замість збереження р-значення з кожного генерованого набору даних, ви можете зберегти рядок p-значень. Усереднення в кожному стовпчику дає вам швидке та брудне відчуття того, як змінюється потужність без с / , і допомагає швидко відточити відповідне значення. N NNNN
gung - Відновіть Моніку

2
@gung: ваш коментар має сенс, чи не заперечуєте ви додавати свої коди, щоб менше досвідчених людей в R також могло отримати користь від цього? спасибі

1
Я переглядаю це ще раз, і у мене є кілька запитань: 1) Чому х уніформа 1:10? 2) Як би ви узагальнили його до більш ніж 1 незалежної змінної?
Пітер Флом - Відновіть Моніку

1
@PeterFlom, x повинно бути щось, тому я вибрав (довільно), щоб він був рівномірним між 0 і 10, це також могло бути нормальним, гамма і т. Д. Найкраще було б вибрати щось подібне до того, що ми очікуємо реального x змінні на вигляд. Щоб використовувати більше 1 змінної предиктора, генеруйте їх незалежно (або з багатоваріантної нормальної, копули тощо), а потім просто включіть їх у елемент1, наприклад eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3.
Грег Сніг

1
@ABC, не реплікація дасть вам лише одне рішення, вам потрібні реплікації, щоб визначити, як часто тест відхиляє (визначення потужності). replicateне знаходиться у функції та не змінюється. Функція повертає p-значення (що відповідає fit $ stats [5]) за одну ітерацію, реплікація виконує функцію 1000 разів (або будь-яке число, яке ви вказали) та повертає 1000 p-значень, meanтоді функція обчислює частку тести, які б відхилили нуль при . α=0.05
Грег Сноу

3

Я відповів би ще одне на відповідь Сноу (і це стосується будь-якого аналізу потужності за допомогою симуляції) - зверніть увагу на те, чи шукаєте ви 1 або 2 хвіст тесту. Популярні програми, такі як G * Power за замовчуванням для односхилого тесту, і якщо ви намагаєтеся побачити, чи відповідають ваші імітації (завжди гарна ідея, коли ви навчитеся робити це), ви хочете перевірити це спочатку.

Для того, щоб Сніг запустив тест на 1 хвіст, я додав би параметр, який називається "хвіст", до функціональних входів і помістив щось подібне у саму функцію:

 #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 кінцем в основному перевіряє, чи є коефіцієнт позитивним, а потім скорочує р-значення навпіл.


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; /stats//a/22410/231675 ):

Я все ще не впевнений, як має виглядати моделювання з більш (зокрема, трьома) незалежними змінними. Я розумію, що я повинен "включити їх усіх у елемент1, наприклад, ета1 <- бета0 + бета1 * х1 + бета2 * х2 + бета3 * х3" (як згадувалося вище). Але я не знаю, як відрегулювати решту параметрів у функції. Може хтось допоможе мені в цьому?


1
Я думаю, ви отримаєте кращу відповідь, якби ви задали нове запитання із посиланням на це питання.
mdewey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.