Perhitungan ukuran sampel untuk regresi logistik univariat

11

Bagaimana seseorang menghitung ukuran sampel yang diperlukan untuk penelitian di mana kohort subyek akan memiliki variabel kontinu tunggal yang diukur pada saat operasi dan kemudian dua tahun kemudian mereka akan diklasifikasikan sebagai hasil fungsional atau hasil yang terganggu.

Kami ingin melihat apakah pengukuran itu bisa memprediksi hasil yang buruk. Pada titik tertentu, kami mungkin ingin mendapatkan titik potong dalam variabel kontinu di atas yang akan kami coba campur tangan untuk mengurangi kemungkinan hasil yang terganggu.

Ada ide? Setiap implementasi R.

Farrel
sumber
Apakah Anda mengharapkan beberapa orang putus sekolah selama masa tindak lanjut? Apakah ada kovariat lain yang termasuk dalam model Anda?
chl
Biarkan saya mengisap tingkat drop out dari ibu jari saya - 20%. Kami memang akan mengumpulkan banyak variabel misalnya, usia, skor trauma tetapi saya ingin menjaga hal-hal sesederhana mungkin untuk perhitungan daya. Saya sering menemukan bahwa mendiskusikan model primer dan kemudian model sekunder yang sarat dengan kemahiran dan nuansa lebih bermanfaat.
Farrel
Oke, tetapi biasanya% dropout yang diharapkan, jumlah kovariat, dan apakah kovariat diukur dengan kesalahan (lihat misalnya, j.mp/9fJkhb ) masukkan rumus (dalam semua kasus, itu akan menambah ukuran sampel).
chl

Jawaban:

7

Perhitungan ukuran sampel untuk regresi logistik sangat kompleks. Saya tidak akan mencoba merangkumnya di sini. Solusi yang dapat diakses secara masuk akal untuk masalah ini terdapat di:

Hsieh TA. Tabel ukuran sampel untuk regresi logistik. Statistik dalam Kedokteran. 1989 Jul; 8 (7): 795-802.

Hsieh TA, dkk. Metode sederhana perhitungan ukuran sampel untuk regresi linier dan logistik. Statistik dalam Kedokteran. 1998 30 Juli; 17 (14): 1623-34.

Diskusi yang dapat diakses tentang masalah-masalah dengan contoh perhitungan dapat ditemukan di bab terakhir (Bagian 8.5 hal. 339-347) dari Regresi Logistik Terapan Hosmer & Lemeshow .

Thylacoleo
sumber
7

Saya biasanya merasa lebih mudah dan lebih cepat untuk menjalankan simulasi. Makalah membutuhkan waktu lama untuk dibaca, dipahami, dan akhirnya sampai pada kesimpulan bahwa mereka tidak berlaku dalam kasus khusus yang diminati.

Oleh karena itu, saya hanya akan memilih sejumlah mata pelajaran, mensimulasikan kovariat yang Anda minati (didistribusikan sesuai dengan keyakinan Anda), mensimulasikan hasil baik / buruk berdasarkan bentuk fungsional yang Anda tempatkan (efek ambang kovariat? Nonlinier?) dengan ukuran efek signifikan minimum (secara klinis) yang ingin Anda deteksi, jalankan hasilnya melalui analisis Anda dan lihat apakah efeknya ditemukan pada alpha Anda. Jalankan kembali ini 10.000 kali dan lihat apakah Anda menemukan efek dalam 80% dari simulasi (atau kekuatan apa pun yang Anda butuhkan). Sesuaikan jumlah subjek, ulangi sampai Anda memiliki kekuatan yang Anda senangi.

Ini memiliki keuntungan menjadi sangat umum, sehingga Anda tidak terbatas pada bentuk fungsional tertentu atau jumlah tertentu atau distribusi kovariat. Anda dapat memasukkan dropout, lihat komentar chl di atas, baik secara acak atau dipengaruhi oleh kovariat atau hasil. Pada dasarnya Anda mengkode analisis yang akan Anda lakukan pada sampel akhir sebelumnya, yang terkadang membantu memfokuskan pemikiran saya pada desain studi. Dan itu mudah dilakukan dalam R (vectorize!).

Stephan Kolassa
sumber
Apakah Anda memiliki kasing yang berfungsi di R?
Farrel
1
@ Farrel - ini skrip yang sangat pendek, yang mengasumsikan [0,1] kovariat yang didistribusikan secara seragam, OR 2 antara kuartil pertama dan ketiga kovariat dan kebisingan normal standar, yang mengarah ke daya .34 untuk n = 100. Saya akan bermain-main dengan ini untuk melihat betapa sensitifnya segala sesuatu terhadap asumsi saya: menjalankan <- 1000; nn <- 100; set.seed (2010); deteksi <- replikasi (n = berjalan, expr = {kovariat <- runif (nn); hasil <- runif (nn) <1 / (1 + exp (-2 * log (2) * kovariat + rnorm (nn)) ); ringkasan (glm (hasil ~ kovariat, keluarga = "binomial")) $ koefisien ["kovariat", "Pr (> | z |)"] <.05}) cat ("Power:", jumlah (deteksi) / berjalan, "\ n")
Stephan Kolassa
1
Anda dapat melampirkan kode Anda sebagai pastie ( pastebin.com ) atau Gist ( gist.github.com ) jika Anda merasa lebih nyaman, dan menautkan kembali ke dalam komentar Anda.
chl
@ chl: +1, terima kasih banyak! Inilah intinya: gist.github.com/607968
Stephan Kolassa
Kode yang bagus tapi ada masalah. Aku tidak sepintar dirimu. Saya perlu dipecah bertahap. Saya mengambilnya menjalankan jumlah simulasi? Apa itu nn? Apakah jumlah subjek dalam penelitian ini? Lalu saya melihat Anda membuat distribusi kovariat dan membuat mereka menentukan ya atau tidak, tergantung pada ambang batas.
Farrel
4

Sebagai lanjutan dari posting oleh Stephan Kolassa (saya tidak bisa menambahkan ini sebagai komentar), saya punya beberapa kode alternatif untuk simulasi. Ini menggunakan struktur dasar yang sama, tetapi meledak sedikit lebih, jadi mungkin sedikit lebih mudah dibaca. Ini juga didasarkan pada kode oleh Kleinman dan Horton untuk mensimulasikan regresi logistik.

nn adalah angka dalam sampel. Kovariat harus didistribusikan secara terus menerus secara normal, dan distandarisasi untuk berarti 0 dan sd 1. Kami menggunakan rnorm (nn) untuk menghasilkan ini. Kami memilih rasio odds dan menyimpannya di odds.ratio. Kami juga memilih nomor untuk intersep. Pilihan nomor ini menentukan proporsi sampel yang mengalami "peristiwa" (mis. 0,1, 0,4, 0,5). Anda harus bermain-main dengan nomor ini sampai Anda mendapatkan proporsi yang tepat. Kode berikut memberi Anda proporsi 0,1 dengan ukuran sampel 950 dan 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)

ringkasan (proporsi) menegaskan bahwa proporsinya ~ 0,1

Kemudian menggunakan variabel yang sama, daya dihitung lebih dari 10.000 berjalan:

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)

Saya pikir kode ini benar - saya memeriksanya dengan contoh yang diberikan dalam Hsieh, 1998 (tabel 2), dan sepertinya setuju dengan tiga contoh yang diberikan di sana. Saya juga mengujinya terhadap contoh pada hal 342 - 343 dari Hosmer dan Lemeshow, di mana ia menemukan kekuatan 0,75 (dibandingkan dengan 0,8 dalam Hosmer dan Lemeshow). Jadi mungkin dalam beberapa keadaan pendekatan ini meremehkan kekuasaan. Namun, ketika saya menjalankan contoh yang sama dalam kalkulator online ini , saya menemukan bahwa itu sesuai dengan saya dan bukan hasil di Hosmer dan Lemeshow.

Jika ada yang bisa memberi tahu kami mengapa demikian, saya akan tertarik untuk mengetahuinya.

Andrew
sumber
Saya punya 2 pertanyaan jika Anda tidak keberatan. 1) Apakah fungsi proporsi hanya untuk mendapatkan intersepsi yang benar? 2) apa logika di balik penggunaan ytest (membandingkan prob dengan uni draw acak)?
B_Miner
@ B_Miner 1) Sebaliknya - untuk mendapatkan proporsi yang tepat, Anda perlu mengatur intersep dengan benar - jadi sesuaikan intersep sampai Anda mendapatkan proporsi yang Anda harapkan. 2) Logika ytest adalah bahwa kita perlu mendapatkan hasil 0 atau 1 dikotomis. Jadi kami membandingkan setiap sampel dari distribusi yang seragam dengan probabilitas (prob) untuk mendapatkan hasil dikotomis kami. 'Runis' tidak harus diambil dari distribusi seragam acak - binomial atau distribusi lain mungkin lebih masuk akal untuk data Anda. Semoga ini bisa membantu (maaf atas keterlambatan balasan).
Andrew
3

θ=10:θ=0

sebenarnya, kedengarannya seperti studi Anda akan dilakukan secara berurutan. dalam hal itu, mungkin membayar untuk menjadikannya bagian eksplisit dari percobaan. pengambilan sampel berurutan sering kali bisa lebih efisien daripada percobaan ukuran sampel tetap [rata-rata pengamatan lebih sedikit diperlukan].

farrel: saya menambahkan ini sebagai balasan atas komentar Anda.

untuk mendapatkan ukuran sampel, orang biasanya menentukan semacam kriteria presisi untuk perkiraan [seperti panjang CI] ATAU daya pada alternatif uji tertentu yang akan dilakukan pada data. Anda tampaknya telah menyebutkan kedua kriteria ini. tidak ada yang salah dengan itu, pada prinsipnya: Anda hanya perlu melakukan dua perhitungan ukuran sampel - satu untuk mencapai ketepatan estimasi yang diinginkan - dan yang lain untuk mendapatkan kekuatan yang diinginkan pada alternatif yang disebutkan. maka yang lebih besar dari dua ukuran sampel adalah apa yang dibutuhkan. [btw - selain mengatakan kekuatan 80% - Anda sepertinya tidak menyebutkan tes apa yang ingin Anda lakukan - atau alternatif di mana Anda menginginkan kekuatan 80%.]

seperti untuk menggunakan analisis sekuensial: jika subjek terdaftar dalam penelitian semua pada saat yang sama, maka ukuran sampel tetap masuk akal. tetapi jika subjeknya sedikit dan jarang, mungkin perlu satu atau dua tahun [atau lebih] untuk mendapatkan nomor yang diperlukan terdaftar. dengan demikian persidangan dapat berlangsung selama tiga atau empat tahun [atau lebih]. dalam kasus itu, skema berurutan menawarkan kemungkinan untuk berhenti lebih cepat dari itu - jika efek yang Anda cari menjadi signifikan secara statistik di awal persidangan.

Ronaf
sumber
Kriteria akan menjadi perbedaan 10% dalam probabilitas hasil baik vs buruk. Atau katakanlah karena itu akan menjadi regresi logistik, rasio odds = 2. alpha = 0,05, daya = 80%, saya belum tahu apa perbedaan yang dikumpulkan pada variabel kontinu tetapi mari kita asumsikan bahwa standar deviasi adalah 7mmHg. Analisis sekuensial akan baik tetapi hasil akhirnya adalah dua tahun setelah pengukuran dilakukan.
Farrel