%macro kappa(data=,var=,ref=); options nonotes; data _kdata; set &data; array _x (*) &var; call symput('nv',dim(_x)); _y=cats(of &var)+0; run; options notes; proc nlmixed data=_kdata df=1e8; %if &nv= %then %let nv=%sysfunc( countw(&var) ); %let epsum=; %let p=; %let v=; %do i=0 %to 2**&nv-1; %if &i>0 %then %do; ep&i=exp(int&i); %let epsum=&epsum ep&i; %end; %let p=&p %sysfunc(cats(p,_%sysfunc(putn(&i,binary&nv.)))); %let v=&v %sysfunc(putn(&i,binary&nv.)); %end; %let lastp=%scan(&p,-1); &lastp = 1/(1+ %sysfunc( translate(&epsum,%str(+),%str( )) ) ); %do i=1 %to 2**&nv-1; %scan(&p,&i)=&lastp*ep&i; %end; %do i=1 %to &nv; %do j=&i+1 %to &nv; %if &ref= or &i=&ref or &j=&ref %then %do; %do k=0 %to 1; %do m=0 %to 1; %let plist=; %do t=1 %to 2**&nv; %let px=%scan(&p,&t); %if %substr(&px,&i+2,1)=&k and %substr(&px,&j+2,1)=&m %then %let plist=&plist &px; %end; p&k&m._&i&j=%sysfunc( translate(&plist,%str(+),%str( )) ); %end; %end; pobs&i&j=(p00_&i&j+p11_&i&j); pexp&i&j=(p00_&i&j+p01_&i&j)*(p00_&i&j+p10_&i&j)+ (p10_&i&j+p11_&i&j)*(p01_&i&j+p11_&i&j); kappa_&i&j=(pobs&i&j-pexp&i&j)/(1-pexp&i&j); %end; %end; %end; if _y=%scan(&v,1) then _p=%scan(&p,1); %do i=2 %to 2**&nv-1; else if _y=%scan(&v,&i) then _p=%scan(&p,&i); %end; else _p=&lastp; _p = (_p>0 and _p<=1)*_p + (_p<=0)*1e-8 + (_p>1); _loglik = log(_p); model _y ~ general(_loglik); %mend;