J'essaie d'exécuter une régression zéro gonflée pour une variable de réponse continue dans R. Je connais une implémentation gamlss, mais j'aimerais vraiment essayer cet algorithme de Dale McLerran qui est conceptuellement un peu plus simple. Malheureusement, le code est en SAS et je ne sais pas comment le réécrire pour quelque chose comme nlme.
Le code est comme suit:
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;
De: http://listserv.uga.edu/cgi-bin/wa?A2=ind0805A&L=sas-l&P=R20779
AJOUTER:
Remarque: Il n'y a pas d'effets mixtes ici - seulement fixes.
L'avantage de cet ajustement est que (même si les coefficients sont les mêmes que si vous ajustez séparément une régression logistique à P (y = 0) et une régression d'erreur gamma avec un lien logarithmique à E (y | y> 0)), vous pouvez estimer la fonction combinée E (y) qui comprend les zéros. On peut prédire cette valeur en SAS (avec un CI) en utilisant la ligne predict (1 - p_yEQ0)*mu
.
De plus, on est capable d'écrire des déclarations de contraste personnalisées pour tester la signification des variables prédictives sur E (y). Par exemple, voici une autre version du code SAS que j'ai utilisé:
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;
Ensuite, pour estimer "cadeau1" par rapport à "cadeau2" (b1 par rapport à b2), nous pouvons écrire cette déclaration d'estimation:
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)) ;
Est-ce que R peut faire ça?