Sto cercando di eseguire una regressione a zero per una variabile di risposta continua in R. Sono consapevole dell'implementazione di gamlss, ma mi piacerebbe davvero provare questo algoritmo di Dale McLerran che è concettualmente un po 'più semplice. Sfortunatamente, il codice è in SAS e non sono sicuro di come riscriverlo per qualcosa come nlme.
Il codice è il seguente:
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;
Da: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
INSERISCI:
Nota: qui non sono presenti effetti misti, solo risolti.
Il vantaggio di questo adattamento è che (anche se i coefficienti sono gli stessi se si adatta separatamente una regressione logistica a P (y = 0) e una regressione dell'errore gamma con collegamento log a E (y | y> 0)) è possibile stimare la funzione combinata E (y) che include gli zeri. Si può prevedere questo valore in SAS (con un elemento della configurazione) usando la linea predict (1 - p_yEQ0)*mu
.
Inoltre, si è in grado di scrivere istruzioni di contrasto personalizzate per testare il significato delle variabili predittive su E (y). Ad esempio, ecco un'altra versione del codice SAS che ho usato:
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;
Quindi per stimare "regalo1" rispetto a "regalo2" (b1 contro b2) possiamo scrivere questa dichiarazione di stima:
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 può farlo?