ฉันพยายามเรียกใช้การถดถอยที่ไม่ต้องเสียค่าศูนย์สำหรับตัวแปรตอบสนองต่อเนื่องใน R. ฉันทราบว่ามีการใช้งาน gamlss แต่ฉันอยากลองใช้อัลกอริทึมนี้โดย Dale McLerran ซึ่งเป็นแนวคิดที่ค่อนข้างตรงไปตรงมามากกว่า น่าเสียดายที่รหัสนั้นอยู่ใน SAS และฉันไม่แน่ใจว่าจะเขียนใหม่สำหรับ nlme ได้อย่างไร
รหัสดังต่อไปนี้:
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;
จาก: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
เพิ่ม:
หมายเหตุ: ไม่มีเอฟเฟกต์ผสมอยู่ที่นี่ - แก้ไขแล้วเท่านั้น
ข้อดีของการติดตั้งแบบนี้ก็คือ (แม้ว่าค่าสัมประสิทธิ์จะเหมือนกับว่าคุณแยกการถดถอยโลจิสติกให้เท่ากับ P (y = 0) และการถดถอยข้อผิดพลาดของแกมม่าที่มีลิงก์เชื่อมโยงไปยัง E (y | y> 0) ประมาณฟังก์ชั่นรวม E (y) ซึ่งรวมถึงศูนย์ ใครสามารถทำนายค่านี้ใน SAS (มี CI) predict (1 - p_yEQ0)*mu
ที่ใช้สาย
นอกจากนี้เราสามารถเขียนข้อความความคมชัดที่กำหนดเองเพื่อทดสอบความสำคัญของตัวแปรทำนายใน E (y) ตัวอย่างเช่นนี่คืออีกรุ่นของรหัส SAS ที่ฉันใช้:
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;
จากนั้นเพื่อประมาณ "gift1" กับ "gift2" (b1 กับ b2) เราสามารถเขียนคำสั่งประเมินนี้:
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 ทำสิ่งนี้ได้ไหม?