Ich versuche, eine Null-Inflations-Regression für eine kontinuierliche Antwortvariable in R auszuführen. Mir ist eine Gamlss-Implementierung bekannt, aber ich möchte diesen Algorithmus von Dale McLerran wirklich ausprobieren, der konzeptionell etwas einfacher ist. Leider ist der Code in SAS und ich bin nicht sicher, wie ich ihn für so etwas wie nlme neu schreiben soll.
Der Code lautet wie folgt:
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;
Von: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
HINZUFÜGEN:
Hinweis: Hier sind keine gemischten Effekte vorhanden - nur behoben.
Der Vorteil dieser Anpassung besteht darin, dass Sie (obwohl die Koeffizienten dieselben sind, als ob Sie eine logistische Regression an P (y = 0) und eine Gammafehlerregression mit logarithmischer Verknüpfung an E (y | y> 0) separat anpassen) dies können Schätzen Sie die kombinierte Funktion E (y), die die Nullen enthält. Diesen Wert kann man in SAS (mit einem CI) anhand der Linie vorhersagenpredict (1 - p_yEQ0)*mu
.
Ferner kann man benutzerdefinierte Kontrastanweisungen schreiben, um die Signifikanz von Prädiktorvariablen auf E (y) zu testen. Hier ist zum Beispiel eine andere Version des SAS-Codes, den ich verwendet habe:
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;
Um dann "Geschenk1" gegen "Geschenk2" (b1 gegen b2) zu schätzen, können wir diese Schätzungserklärung schreiben:
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)) ;
Kann R das tun?