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?
Antworten:
Nachdem ich einige Zeit mit diesem Code verbracht habe, scheint es mir, als ob es im Grunde genommen:
1) Führt eine logistische Regression mit der rechten Seite
b0_f + b1_f*x1
undy > 0
als Zielvariable durch,2) Für die Beobachtungen für die y> 0 ist , eine Regression mit dem rechten Seite durchführt
b0_h + b1_h*x1
, eine Gamma - Wahrscheinlichkeit undlink=log
,3) Schätzt auch den Formparameter der Gammaverteilung.
Es maximiert die Wahrscheinlichkeit gemeinsam, was sehr schön ist, da Sie nur einen Funktionsaufruf ausführen müssen. Die Wahrscheinlichkeit trennt sich jedoch trotzdem, sodass Sie keine verbesserten Parameterschätzungen erhalten.
Hier ist ein R-Code, der die
glm
Funktion nutzt , um Programmieraufwand zu sparen. Dies ist möglicherweise nicht das, was Sie möchten, da es den Algorithmus selbst verdeckt. Der Code ist sicherlich auch nicht so sauber, wie er sein könnte / sollte.Der Formparameter für die Gammaverteilung ist gleich 1 / der Dispersionsparameter für die Gammafamilie. Auf Koeffizienten und andere Dinge, auf die Sie möglicherweise programmgesteuert zugreifen möchten, kann über die einzelnen Elemente der Rückgabewertliste zugegriffen werden:
Die Vorhersage kann über die Ausgabe der Routine erfolgen. Hier ist ein weiterer R-Code, der zeigt, wie erwartete Werte generiert werden, sowie einige andere Informationen:
Und ein Probelauf:
Nun zur Koeffizientenextraktion und den Kontrasten:
quelle
foo.pred$fit
gibt die Rückgabe die Punktschätzung von E (y) an, aber die Komponentefoo.pred$pred.ygt0$pred
würde Ihnen E (y | y> 0) geben. Ich habe in der Standardfehlerberechnung für y, BTW, als se.fit zurückgegeben. Die Koeffizienten können aus den Komponenten durch Koeffizienten (foo.pred$pred.ygt0
) und Koeffizienten (foo.pred$pred.p.ygt0
) erhalten werden; Ich werde in Kürze eine Extraktionsroutine und eine Kontrastroutine schreiben.