Tôi đang cố gắng chạy hồi quy không tăng cho biến phản hồi liên tục trong R. Tôi biết về việc triển khai gamlss, nhưng tôi thực sự muốn thử thuật toán này của Dale McLerran về mặt khái niệm đơn giản hơn một chút. Thật không may, mã nằm trong SAS và tôi không chắc làm thế nào để viết lại nó cho một cái gì đó như nlme.
Mã này như sau:
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;
Từ: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
THÊM VÀO:
Lưu ý: Không có hiệu ứng hỗn hợp nào hiện diện ở đây - chỉ cố định.
Ưu điểm của sự phù hợp này là (mặc dù các hệ số giống như khi bạn tách riêng một hồi quy logistic thành P (y = 0) và hồi quy lỗi gamma với liên kết nhật ký đến E (y | y> 0)) bạn có thể ước tính hàm kết hợp E (y) bao gồm các số 0. Người ta có thể dự đoán giá trị này trong SAS (với CI) bằng cách sử dụng dòng predict (1 - p_yEQ0)*mu
.
Hơn nữa, người ta có thể viết các câu lệnh tương phản tùy chỉnh để kiểm tra tầm quan trọng của các biến dự đoán trên E (y). Ví dụ, đây là một phiên bản khác của mã SAS tôi đã sử dụng:
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;
Sau đó, để ước tính "gift1" so với "gift2" (b1 so với b2), chúng ta có thể viết tuyên bố ước tính này:
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)) ;
R có thể làm điều này?