Saya mencoba menjalankan regresi nol-naik untuk variabel respon kontinu dalam R. Saya menyadari implementasi gamls, tetapi saya benar-benar ingin mencoba algoritma ini oleh Dale McLerran yang secara konsep sedikit lebih mudah. Sayangnya, kodenya ada di SAS dan saya tidak yakin bagaimana menulisnya kembali untuk sesuatu seperti nlme.
Kode tersebut adalah sebagai berikut:
proc nlmixed data=mydata;
parms b0_f=0 b1_f=0
b0_h=0 b1_h=0
log_theta=0;
eta_f = b0_f + b1_f*x1 ;
p_yEQ0 = 1 / (1 + exp(-eta_f));
eta_h = b0_h + b1_h*x1;
mu = exp(eta_h);
theta = exp(log_theta);
r = mu/theta;
if y=0 then
ll = log(p_yEQ0);
else
ll = log(1 - p_yEQ0)
- lgamma(theta) + (theta-1)*log(y) - theta*log(r) - y/r;
model y ~ general(ll);
predict (1 - p_yEQ0)*mu out=expect_zig;
predict r out=shape;
estimate "scale" theta;
run;
Dari: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
MENAMBAHKAN:
Catatan: Tidak ada efek campuran hadir di sini - hanya diperbaiki.
Keuntungan dari pemasangan ini adalah (walaupun koefisiennya sama seperti jika Anda secara terpisah memasukkan regresi logistik ke P (y = 0) dan regresi kesalahan gamma dengan tautan log ke E (y | y> 0)) Anda dapat memperkirakan fungsi gabungan E (y) yang mencakup nol. Seseorang dapat memprediksi nilai ini dalam SAS (dengan CI) menggunakan garis predict (1 - p_yEQ0)*mu
.
Lebih lanjut, seseorang dapat menulis pernyataan kontras khusus untuk menguji signifikansi variabel prediktor pada E (y). Sebagai contoh, ini adalah versi lain dari kode SAS yang telah saya gunakan:
proc nlmixed data=TestZIG;
parms b0_f=0 b1_f=0 b2_f=0 b3_f=0
b0_h=0 b1_h=0 b2_h=0 b3_h=0
log_theta=0;
if gifts = 1 then x1=1; else x1 =0;
if gifts = 2 then x2=1; else x2 =0;
if gifts = 3 then x3=1; else x3 =0;
eta_f = b0_f + b1_f*x1 + b2_f*x2 + b3_f*x3;
p_yEQ0 = 1 / (1 + exp(-eta_f));
eta_h = b0_h + b1_h*x1 + b2_h*x2 + b3_h*x3;
mu = exp(eta_h);
theta = exp(log_theta);
r = mu/theta;
if amount=0 then
ll = log(p_yEQ0);
else
ll = log(1 - p_yEQ0)
- lgamma(theta) + (theta-1)*log(amount) - theta*log(r) - amount/r;
model amount ~ general(ll);
predict (1 - p_yEQ0)*mu out=expect_zig;
estimate "scale" theta;
run;
Kemudian untuk memperkirakan "gift1" versus "gift2" (b1 versus b2) kita dapat menulis pernyataan estimasi ini:
estimate "gift1 versus gift 2"
(1-(1 / (1 + exp(-b0_f -b1_f))))*(exp(b0_h + b1_h)) - (1-(1 / (1 + exp(-b0_f -b2_f))))*(exp(b0_h + b2_h)) ;
Bisakah R melakukan ini?
Jawaban:
Setelah menghabiskan beberapa waktu pada kode ini, tampaknya bagi saya seolah-olah pada dasarnya:
1) Melakukan regresi logistik dengan sisi kanan
b0_f + b1_f*x1
dany > 0
sebagai variabel target,2) Untuk pengamatan yang y> 0, lakukan regresi dengan sisi kanan
b0_h + b1_h*x1
, kemungkinan Gamma danlink=log
,3) Juga memperkirakan parameter bentuk distribusi Gamma.
Ini memaksimalkan kemungkinan secara bersama, yang bagus, karena Anda hanya perlu melakukan panggilan fungsi satu. Namun, kemungkinannya terpisah, jadi Anda tidak mendapatkan perkiraan parameter yang ditingkatkan sebagai hasilnya.
Berikut adalah beberapa kode R yang memanfaatkan
glm
fungsi untuk menghemat upaya pemrograman. Ini mungkin bukan yang Anda inginkan, karena mengaburkan algoritma itu sendiri. Kode itu juga tidak sebersih yang seharusnya / seharusnya.Parameter bentuk untuk distribusi Gamma sama dengan 1 / parameter dispersi untuk keluarga Gamma. Koefisien dan hal-hal lain yang mungkin ingin Anda akses secara programatik dapat diakses pada elemen individual dari daftar nilai pengembalian:
Prediksi dapat dilakukan dengan menggunakan output dari rutin. Berikut ini beberapa kode R yang menunjukkan cara menghasilkan nilai yang diharapkan dan beberapa informasi lainnya:
Dan contoh dijalankan:
Sekarang untuk ekstraksi koefisien dan kontrasnya:
sumber
foo.pred$fit
memberikan estimasi titik E (y), tetapi komponenfoo.pred$pred.ygt0$pred
akan memberi Anda E (y | y> 0). Saya menambahkan dalam perhitungan kesalahan standar untuk y, BTW, dikembalikan sebagai se.fit. Koefisien dapat diperoleh dari komponen dengan koefisien (foo.pred$pred.ygt0
) dan koefisien (foo.pred$pred.p.ygt0
); Saya akan menulis rutin ekstraksi dan rutin kontras dalam beberapa saat.