R에서 연속 응답 변수에 대해 0으로 부풀린 회귀를 실행하려고합니다. 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에 로그 링크를 갖는 감마 오류 회귀와 동일하더라도)에도 불구하고 0을 포함하는 결합 함수 E (y)를 추정하십시오. line을 사용하여 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이 할 수 있습니까?