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はこれを行うことができますか?