Розрахунок розміру вибірки для одновимірної логістичної регресії


11

Як можна обчислити розмір вибірки, необхідний для дослідження, в якому в когорті суб'єктів буде мати єдину безперервну змінну, виміряну на момент операції, а потім через два роки вони будуть класифіковані як функціональний результат або ослаблений результат.

Ми хотіли б побачити, чи міг би цей показник передбачити поганий результат. У якийсь момент ми можемо захотіти отримати точку зрізу в постійній змінній, над якою ми намагатимемося втрутитися, щоб зменшити ймовірність порушення результату.

Будь-які ідеї? Будь-яка реалізація R.


Чи очікуєте ви якихось відмов під час спостереження? Чи є ще якісь коваріати, які слід включити до вашої моделі?
chl

Дозвольте мені висмоктати палець із пальця - 20%. Ми дійсно будемо збирати багато змінних, наприклад, вік, оцінка травми, але я хотів, щоб все було максимально простим для розрахунку потужності. Мені часто здається корисним обговорити первинну модель, а потім і вторинні моделі, які завантажуються з більшою тонкістю та нюансами.
Farrel

Гаразд, але зазвичай очікуване% випадання, кількість коваріатів та вимірювання коваріатів помилками (див., Наприклад, j.mp/9fJkhb ) вводять формулу (у всякому разі це збільшить розмір вибірки).
chl

Відповіді:


7

Розрахунки розмірів вибірки для логістичної регресії є складними. Я не намагаюся тут узагальнити це. Розумно доступні рішення цієї проблеми знаходяться у:

Hsieh FY. Таблиці розмірів зразків для логістичної регресії. Статистика в медицині. 1989, липень; 8 (7): 795-802.

Hsieh FY та ін. Простий метод розрахунку розміру вибірки для лінійної та логістичної регресії. Статистика в медицині. 1998. 30 липня; 17 (14): 1623-34.

Доступне обговорення питань із прикладними розрахунками можна знайти в останньому розділі (Розділ 8.5 стор. 339-347) прикладної логістичної регресії Хосмера та Лемешоу .


7

Зазвичай мені легше і швидше запустити симуляцію. Роботи потребують багато часу, щоб прочитати, зрозуміти і нарешті дійти висновку, що вони не застосовуються у спеціальному випадку, який цікавить вас.

Тому я просто обрав би декілька предметів, змоделював коваріат, який вас зацікавив (розподілений так, як ви вважаєте, що це буде), моделювати добрі / погані результати на основі функціональної форми, яку ви позиціонуєте (порогові ефекти коваріату? Нелінійність?) з мінімальним (клінічно) значним розміром ефекту, який ви хотіли б виявити, запустіть результат за допомогою аналізу та подивіться, чи знайдеться ефект у вашої альфа. Повторіть це 10000 разів і подивіться, чи знайшли ви ефект у 80% симуляцій (або будь-якої іншої сили, яка вам потрібна). Відрегулюйте кількість предметів, повторюйте, поки не отримаєте сили, якими ви задоволені.

Це має перевагу в тому, що вона є дуже загальною, тому ви не обмежуєтесь певною функціональною формою або певним числом або розподілом коваріатів. Ви можете включити відміни, див. Коментар chl вище, навмання, або під впливом коваріату чи результату. Ви, як правило, заздалегідь кодуєте аналіз, який збираєтесь зробити на остаточному зразку, що іноді допомагає зосередити мою думку на дизайні дослідження. І це легко зробити в R (vectorize!).


У вас є спрацьований випадок у R?
Farrel

1
@Farrel - ось дуже короткий сценарій, який передбачає [0,1] -рівномірно розподілені коваріати, АБО 2 між першим і третім кварталом коваріату і стандартним нормальним шумом, що веде до потужності .34 при n = 100. Я б пограв з цим, щоб побачити, наскільки все чутливе до моїх припущень: пробіг <- 1000; nn <- 100; set.seed (2010); виявлення <- реплікація (n = пробіг, expr = {covariate <- runif (nn); результат <- runif (nn) <1 / (1 + exp (-2 * log (2) * covariate + rnorm (nn)) ); підсумок (glm (результат ~ коваріат, сімейство = "двочлен")) $ коефіцієнти ["коваріат", "пр (> | z |)"] <.05}) кішка ("потужність:", сума (виявлення)) / працює, "\ n")
Стефан Коласа

1
Ви можете прикріпити свій код як пасти ( pastebin.com ) або Gist ( gist.github.com ), якщо вам здається, що це зручніше, і посилання на нього в коментарі.
chl

@chl: +1, велике спасибі! Ось суть: gist.github.com/607968
Стефан Коласа

Чудовий код, але є проблема. Я не такий розумний, як ти. Мені потрібно її розбити поступово. Я вважаю, це працює кількість моделювання? Що таке nn? Чи кількість предметів у дослідженні? Тоді я бачу, що ви створили розподіл коваріатів і змусили їх визначати так чи ні залежно від порогу.
Farrel

4

Після публікації від Стефана Коласса (я не можу додати це як коментар), у мене є альтернативний код для моделювання. Тут використовується однакова основна структура, але вибухає трохи більше, тому, можливо, її читати трохи простіше. Він також заснований на коді Клеймана та Хортона для імітації логістичної регресії.

nn - число у вибірці. Коваріат повинен бути постійно нормально розподілений і стандартизований на значення 0 і sd 1. Для цього генеруємо rnorm (nn). Ми вибираємо коефіцієнт шансів і зберігаємо його в коефіцієнті. Ми також підбираємо номер для перехоплення. Вибір цього числа визначає, яка частка вибірки переживає "подію" (наприклад, 0,1, 0,4, 0,5). Ви повинні пограти з цим числом, поки не отримаєте потрібну пропорцію. Наступний код дає пропорцію 0,1 з розміром вибірки 950 та АБО 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)

резюме (пропорція) підтверджує, що пропорція становить ~ 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), і, схоже, згоден з трьома наведеними там прикладами. Я також протестував це на прикладі на p 342 - 343 Hosmer та Lemeshow, де він знайшов потужність 0,75 (порівняно з 0,8 у Hosmer та Lemeshow). Тож може статися, що в деяких обставинах цей підхід недооцінює владу. Однак, коли я запустив той самий приклад у цьому он-лайн калькуляторі , я виявив, що він узгоджується зі мною, а не з результатом у Hosmer та Lemeshow.

Якщо хтось може сказати нам, чому це так, мені було б цікаво знати.


У мене є два питання, якщо ви не проти. 1) Чи пропорція функції просто, щоб отримати перехоплення правильним? 2) у чому полягає логіка використання ytest (порівняння задачі зі випадковим малюнком uni)?
B_Miner

@B_Miner 1) Навпаки - щоб виправити пропорцію, вам потрібно правильно встановити перехоплення - тому відрегулюйте перехоплення, поки не отримаєте ту частину, яку ви очікуєте. 2) Логіка ytest полягає в тому, що нам потрібно отримати дихотомічний результат 0 або 1. Отже, ми порівнюємо кожен зразок від рівномірного розподілу до ймовірності (задачі), щоб отримати наш дихотомічний результат. "Runis" не слід виводити з випадкового рівномірного розподілу - біноміальний або інший розподіл може мати більше сенсу для ваших даних. Сподіваюся, що це допомагає (вибачте за затримку у відповіді).
Андрій

3

θ=10:θ=0

насправді це звучить як ваше дослідження буде проводитися послідовно. у такому випадку, можливо, це заплатить зробити явну частину експерименту. послідовний відбір проб часто може бути більш ефективним, ніж експеримент із фіксованим розміром вибірки [в середньому потрібно менше спостережень].

farrel: я додаю це у відповідь на ваш коментар.

щоб отримати розмір вибірки, зазвичай вказується якийсь критерій точності для оцінки [наприклад, довжина CI] АБО потужність за вказаною альтернативою тесту, який повинен бути проведений на даних. ви, схоже, згадали обидва ці критерії. в цьому немає нічого поганого: вам просто потрібно зробити два обчислення розміру вибірки - один для досягнення бажаної точності оцінки - а інший для отримання бажаної потужності за заявленою альтернативою. то більший з двох розмірів вибірки - це те, що потрібно. [btw - за винятком вимоги 80% потужності - ви, схоже, не згадали тест, який ви плануєте виконати - або альтернативу, за якої ви хочете 80% потужності.]

що стосується використання послідовного аналізу: якщо суб'єкти залучаються до дослідження все одночасно, то фіксований розмір вибірки має сенс. але якщо предметів мало і далеко між ними, для зарахування необхідної кількості може знадобитися рік або два [або більше]. таким чином суд може тривати три-чотири роки [або більше]. у такому випадку послідовна схема пропонує можливість зупинитись раніше - якщо ефект, який ви шукаєте, стане статистично значущим на початку судового процесу.


Критеріями буде 10% різниця у ймовірності хорошого та поганого результату. Або скажемо, оскільки це буде логістична регресія, коефіцієнт шансів = 2. альфа = 0,05, потужність = 80%, я ще не знаю, що є об'єднана дисперсія на безперервній змінній, але припустимо, що стандартне відхилення становить 7 мм рт. Послідовний аналіз був би хорошим, але остаточний результат - через два роки після проведення вимірювання.
Farrel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.