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?