我正在尝试为R中的连续响应变量运行零膨胀回归。不幸的是,代码位于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可以这样做吗?