Pertanyaan ini sebagai jawaban atas jawaban yang diberikan oleh @Greg Snow sehubungan dengan pertanyaan yang saya ajukan mengenai analisis daya dengan regresi logistik dan SAS Proc GLMPOWER
.
Jika saya merancang percobaan dan akan menganalisis hasil dalam regresi logistik faktorial, bagaimana saya bisa menggunakan simulasi (dan di sini ) untuk melakukan analisis daya?
Berikut adalah contoh sederhana di mana ada dua variabel, yang pertama mengambil tiga nilai yang mungkin {0,03, 0,06, 0,09} dan yang kedua adalah indikator dummy {0,1}. Untuk masing-masing kami perkirakan tingkat respons untuk setiap kombinasi (# responden / jumlah orang yang dipasarkan). Lebih lanjut, kami ingin memiliki 3 kali lebih banyak kombinasi faktor pertama dari yang lainnya (yang dapat dianggap sama) karena kombinasi pertama ini adalah versi kami yang telah dicoba dan benar. Ini adalah pengaturan seperti yang diberikan dalam kursus SAS yang disebutkan dalam pertanyaan terkait.
Model yang akan digunakan untuk menganalisis hasil adalah regresi logistik, dengan efek dan interaksi utama (responsnya 0 atau 1).
mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))
Bagaimana saya bisa mensimulasikan set data untuk digunakan dengan model ini untuk melakukan analisis daya?
Ketika saya menjalankan ini melalui SAS Proc GLMPOWER
(menggunakan STDDEV =0.05486016
yang sesuai dengan di sqrt(p(1-p))
mana p adalah rata-rata tertimbang dari tingkat respons yang ditampilkan):
data exemplar;
input Var1 $ Var2 $ response weight;
datalines;
3 0 0.0025 3
3 1 0.00395 1
6 0 0.003 1
6 1 0.0042 1
9 0 0.0035 1
9 1 0.002 1;
run;
proc glmpower data=exemplar;
weight weight;
class Var1 Var2;
model response = Var1 | Var2;
power
power=0.8
ntotal=.
stddev=0.05486016;
run;
Catatan: GLMPOWER
hanya akan menggunakan variabel kelas (nominal) sehingga 3, 6, 9 di atas diperlakukan sebagai karakter dan bisa saja rendah, sedang dan tinggi atau tiga string lainnya. Ketika analisis sebenarnya dilakukan, Var1 akan digunakan numerik (dan kami akan menyertakan istilah polinomial Var1 * Var1) untuk menjelaskan setiap kelengkungan.
Output dari SAS adalah
Jadi kita melihat bahwa kita perlu 762.112 sebagai ukuran sampel kami (efek utama Var2 adalah yang paling sulit untuk diperkirakan) dengan kekuatan sama dengan 0,80 dan alpha sama dengan 0,05. Kami akan mengalokasikan ini sehingga 3 kali lebih banyak dari kombinasi baseline (yaitu 0,375 * 762112) dan sisanya hanya jatuh secara merata ke dalam 5 kombinasi lainnya.
Jawaban:
Persiapan:
Seperti dibahas dalam manual G * Power , ada beberapa jenis analisis daya, tergantung pada apa yang ingin Anda selesaikan. (Yaitu, , ukuran efek , , dan power ada dalam hubungannya satu sama lain; dengan menentukan tiga dari mereka akan membiarkan Anda menyelesaikan untuk yang keempat.) E S αN ES α
Selain postingan @ GregSnow yang luar biasa , panduan hebat lainnya untuk analisis daya berbasis simulasi pada CV dapat ditemukan di sini: Menghitung kekuatan statistik . Untuk merangkum ide-ide dasar:
Apakah Anda akan menemukan signifikansi pada iterasi tertentu dapat dipahami sebagai hasil dari percobaan Bernoulli dengan probabilitas (di mana adalah kekuatan). Proporsi yang ditemukan di atas iterasi memungkinkan kita untuk memperkirakan sebenarnya . Untuk mendapatkan perkiraan yang lebih baik, kita dapat meningkatkan , meskipun ini juga akan membuat simulasi lebih lama. p B p Bhal hal B hal B
Dalam R, cara utama untuk menghasilkan data biner dengan probabilitas keberhasilan yang diberikan adalah ? Rbinom
rbinom(n=10, size=1, prob=p)
, (Anda mungkin ingin menugaskan hasilnya ke variabel untuk penyimpanan)ifelse(runif(1)<=p, 1, 0)
pnorm()
dan menggunakannya dalamrbinom()
kode Anda .Anda menyatakan bahwa Anda akan "memasukkan istilah polinomial Var1 * Var1) untuk memperhitungkan setiap kelengkungan". Ada kebingungan di sini; istilah polinom dapat membantu kita menjelaskan kelengkungan, tetapi ini adalah istilah interaksi - itu tidak akan membantu kita dengan cara ini. Meskipun demikian, tingkat respons Anda mengharuskan kami untuk memasukkan istilah kuadrat dan istilah interaksi dalam model kami. Khususnya, model Anda perlu menyertakan: , , dan , di luar ketentuan dasar. v a r 1 ∗ v a r 2 v a r 1 2 ∗ v a r 2v a r 12 v a r 1 ∗ v a r 2 v a r 12∗ v a r 2
Seperti halnya ada berbagai jenis Tipe I tingkat kesalahan ketika ada beberapa hipotesis (misalnya, tingkat kesalahan per-kontras , tingkat kesalahan familywise , & tingkat kesalahan per-keluarga ), sehingga ada berbagai jenis kekuasaan (misalnya, untuk sebuah efek yang ditentukan sebelumnya , untuk efek apa pun , & untuk semua efek ). Anda juga dapat mencari kekuatan untuk mendeteksi kombinasi efek tertentu, atau untuk kekuatan uji simultan model secara keseluruhan. Dugaan saya dari deskripsi kode SAS Anda adalah bahwa ia mencari yang terakhir. Namun, dari uraian situasi Anda, saya mengasumsikan Anda ingin mendeteksi efek interaksi seminimal mungkin.
Untuk cara berbeda dalam memikirkan masalah yang berkaitan dengan kekuasaan, lihat jawaban saya di sini: Cara melaporkan ketepatan umum dalam memperkirakan korelasi dalam konteks justifikasi ukuran sampel.
Kekuatan post-hoc sederhana untuk regresi logistik di R:
Katakanlah tingkat respons yang Anda ajukan mewakili situasi sebenarnya di dunia, dan Anda telah mengirim 10.000 surat. Apa kekuatan untuk mendeteksi efek-efek itu? (Perhatikan bahwa saya terkenal karena menulis kode "komikal tidak efisien", yang berikut ini dimaksudkan untuk mudah diikuti daripada dioptimalkan untuk efisiensi; pada kenyataannya, ini sangat lambat.)
Jadi kita melihat bahwa 10.000 huruf tidak benar-benar mencapai daya 80% (dalam bentuk apa pun) untuk mendeteksi tingkat respons ini. (Saya tidak cukup yakin tentang apa yang dilakukan kode SAS untuk dapat menjelaskan perbedaan mencolok antara pendekatan ini, tetapi kode ini secara konseptual mudah - jika lambat - dan saya telah meluangkan waktu untuk memeriksanya, dan saya pikir ini hasilnya masuk akal.)
Kekuatan a-priori berbasis simulasi untuk regresi logistik:
Dari sini idenya adalah hanya untuk mencari kemungkinan sampai kita menemukan nilai yang menghasilkan tingkat yang diinginkan dari jenis daya yang Anda minati. Setiap strategi pencarian yang dapat Anda kodekan untuk bekerja dengan ini akan baik-baik saja (dalam teori). Mengingat 's yang akan diperlukan untuk menangkap efek kecil seperti itu, ada baiknya memikirkan bagaimana melakukan ini dengan lebih efisien. Pendekatan khas saya hanyalah kekuatan kasar, yaitu untuk menilai setiap yang mungkin saya pertimbangkan. (Namun perhatikan, bahwa saya biasanya hanya mempertimbangkan kisaran kecil, dan saya biasanya bekerja dengan sangat kecil - setidaknya dibandingkan dengan ini.) N N NN N N N
Alih-alih, strategi saya di sini adalah mengurung kemungkinan untuk mengetahui kisaran daya yang akan terjadi. Jadi, saya mengambil dari 500.000 dan menjalankan kembali kode (memulai benih yang sama, nb ini membutuhkan waktu satu setengah jam untuk menjalankan). Inilah hasilnya: NN N
Kita dapat melihat dari sini bahwa besarnya efek Anda sangat bervariasi, dan dengan demikian kemampuan Anda untuk mendeteksinya bervariasi. Misalnya, efek sangat sulit dideteksi, hanya signifikan 6% dari waktu bahkan dengan setengah juta huruf. Di sisi lain, model secara keseluruhan selalu jauh lebih baik daripada model nol. Kemungkinan lain tersusun di antara keduanya. Meskipun sebagian besar 'data' dibuang pada setiap iterasi, sedikit eksplorasi masih mungkin dilakukan. Sebagai contoh, kita dapat menggunakan matriks untuk menilai korelasi antara probabilitas variabel yang berbeda menjadi signifikan.v a r 12
significant
Saya harus mencatat sebagai kesimpulan, bahwa karena kompleksitas dan besar yang diperlukan dalam situasi Anda, ini tidak sesederhana seperti yang saya duga / klaim dalam komentar awal saya. Namun, Anda tentu bisa mendapatkan ide untuk bagaimana hal ini dapat dilakukan secara umum, dan masalah yang terlibat dalam analisis kekuatan, dari apa yang saya taruh di sini. HTH.N
sumber
pwr
paket). Pendekatan ini memberi Anda kesempatan untuk berpikir lebih jernih (& / atau memperhalus pemikiran Anda) tentang apa yang Anda harapkan akan terjadi, bagaimana Anda akan berurusan dengan itu, dll. Namun, NB, bahwa Anda memang membutuhkan istilah kuadratik, atau sesuatu analog, jika tingkat yang Anda ajukan benar, b / c tidak linear, & interaksi itu sendiri tidak memungkinkan Anda menangkap hubungan curvilinear.poly
daripada menunjukkan pengguna baru R strategi rawan kesalahan lebih dari mengkuadratkan nilai mentah. Saya pikir model lengkapnya harus dianggap sebagaiglm(responses~ poly(var1, 2) * var2, family=binomial(link="logit")
. Keduanya akan kurang rentan terhadap kesalahan statistik dalam interpretasi dan jauh lebih kompak. Mungkin tidak penting dalam hal ini ketika Anda hanya melihat kecocokan secara keseluruhan, tetapi dapat dengan mudah menyesatkan pengguna yang kurang canggih yang mungkin tergoda untuk melihat istilah individual.=
,, dll. Orang akan lebih akrab dengan variabel kuadrat dari regresi dasar kelas, & kurang menyadari apapoly()
itu, jika mereka bukan pengguna R.Jawaban @ Gung sangat bagus untuk pengertian. Inilah pendekatan yang akan saya gunakan:
Fungsi ini menguji efek keseluruhan dari v2, model dapat diubah untuk melihat jenis tes lainnya. Saya suka menulisnya sebagai fungsi sehingga ketika saya ingin menguji sesuatu yang berbeda saya hanya bisa mengubah argumen fungsi. Anda juga bisa menambahkan bilah kemajuan, atau menggunakan paket paralel untuk mempercepat.
Di sini saya hanya melakukan 100 replikasi, saya biasanya mulai sekitar tingkat itu untuk menemukan perkiraan ukuran sampel, kemudian naik iterasi ketika saya berada di taman bola yang tepat (tidak perlu membuang waktu pada 10.000 iterasi ketika Anda memiliki daya 20%).
sumber
n
baris. Mungkin lebih efisien untuk melakukan bobot dalam fungsi juga.