preserve set printback=off set decimal=dot *--------------------------------------------------------------------------- * QCCR1 * Program za simultanu kanonicku korelacijsku analizu * i kanonicku analizu kovarijansi * * Verzija 1.0. * * Kanonicka korelacijska analiza implementirana je u skladu sa * metodama koje su predlozili Hotelling (1935; 1936) i Cooley * and Lohnes (1971); testiranje znacajnosti kanonickih korelacija * izvedeno je postupkom koga je predlozio Bartlett (1941). * * Kanonicka analiza kovarijansi implementirana je u skladu sa * metodom koju su predlozili Momirovic, Dobric i Karaman (1983) * * Poredjenje rezultata dobijenih tim metodama izvedeno je postupkom * koga su predlozili Bosnar, Prot i Momirovic 1984. * * Ovaj program je revizija programa QCCR, napisanog u SS jeziku * (Momirovic, Dobric, Bosnar i Prot, 1984). * * QCCR1 se aktivira na sledeci nacin: * INCLUDE 'QCCR1.SPS'. * QCCR1 SET1=imena varijabli/SET2=imena varijabli/INC=zeljena znacajnost/. * Odredba INC je opciona. Ukoliko se izostavi podrazumeva se statisticka * znacajnost na nivou 0.01. * * Napomena: Makro je manje robustan od regularnih SPSS komandi * Provera regularnosti sintakse je vrlo stroga, tako da se apsolutno * treba pridrzavati zadate sintakse. *--------------------------------------------------------------------------- define qccr1 (set1=!charend('/') /set2=!charend('/') /inc=!default(.01) !charend('/')) preserve set printback=off mxloop=100 mprint off *--------------------------------------------------------------------------- * Cuvanje originalnog fajla *--------------------------------------------------------------------------- save outfile='cc_tmp1.sav' *--------------------------------------------------------------------------- * Kreiranje korelacione matrice. *--------------------------------------------------------------------------- set results off corr variables=!set1 !set2 /missing=listwise/matrix out(*) set decimal=dot set results listing printback off mprint off *--------------------------------------------------------------------------- * Kreiranje korelacionih submatrica *--------------------------------------------------------------------------- matrix get r /variables=!set1/missing=omit/file=* compute p1=ncol(r) get r /file=* /names=varname/missing=omit/variables=!set1 !set2 compute p2=ncol(r)-p1 compute nx1=varname(1:p1) compute nv=p1+p2 compute nx2=varname((p1+1):nv) compute rr=r(4:(nv+3),1:nv) compute ns=r(3,1) compute r11=rr(1:p1,1:p1) compute r22=rr((p1+1):nv,(p1+1):nv) compute r12=rr(1:p1,(p1+1):nv) compute r21=t(r12) release r release nv release rr release varname *--------------------------------------------------------------------------- * Stampanje korelacija *--------------------------------------------------------------------------- compute num={"1","2","3","4","5","6","7","8","9","10","11", "12","13","14","15","16","17","18","19","20","21","22","23","24","25", "26","27","28","29","30","31","32","33","34","35","36","37","38","39", "40","41","42","43","44","45","46","47","48","49","50","51","52","53", "54","55","56","57","58","59","60","61","62","63","64","65","66","67", "68","69","70","71","72","73","74","75","76","77","78","79","80","81", "82","83","84","85","86","87","88","89","90","91","92","93","94","95", "96","97","98","99","100"} print r11 /format "f8.3"/title 'Interkorelacije levog skupa varijabli' /rnames=nx1 /cnames=nx1 print r22 /format "f8.3"/title 'Interkorelacije desnog skupa varijabli' /rnames=nx2 /cnames=nx2 print r12 /format "f8.3" /title 'Kroskorelacije levog i desnog skupa varijabli' /rnames=nx1 /cnames=nx2 print /title 'REZULTATI KANONICKE KORELACIJSKE ANALIZE:' /space 2 *--------------------------------------------------------------------------- * r1 and r2 su matrice dobijene dekompozicijom Cholesk-og * matrica interkorelacija *--------------------------------------------------------------------------- compute r1=chol(r11) compute r2=chol(r22) *--------------------------------------------------------------------------- * r1inv and r2inv su inverzi r1 i r2 *--------------------------------------------------------------------------- compute r1inv=inv(r1) compute r2inv=inv(r2) release r1 release r2 *--------------------------------------------------------------------------- * Izracunavanje omega matrice *--------------------------------------------------------------------------- do if (p1 le p2) compute omega=t(r1inv)*r12*r2inv else compute omega=t(r2inv)*t(r12)*r1inv end if *--------------------------------------------------------------------------- * Singularna dekompozicija matrice omega *--------------------------------------------------------------------------- call svd(omega,u,lambda,v) compute dlam=diag(lambda) release omega release lambda *---------------------------------------------------------------------------- * Konstrukcije struktura za ispis rezultata analize prepokrivanja *---------------------------------------------------------------------------- compute c1={"CV1-1","CV1-2","CV1-3","CV1-4","CV1-5","CV1-6","CV1-7", "CV1-8","CV1-9","CV1-10","CV1-11","CV1-12","CV1-13","CV1-14","CV1-15", "CV1-16","CV1-17","CV1-18","CV1-19","CV1-20","CV1-21","CV1-22","CV1-23", "CV1-24","CV1-25","CV1-26","CV1-27","CV1-28","CV1-29","CV1-30","CV1-31", "CV1-32","CV1-33","CV1-34","CV1-35","CV1-36","CV1-37","CV1-38","CV1-39", "CV1-40","CV1-41","CV1-42","CV1-43","CV1-44","CV1-45","CV1-46","CV1-47", "CV1-48","CV1-49","CV1-50","CV1-51","CV1-52","CV1-53","CV1-54","CV1-55", "CV1-56","CV1-57","CV1-58","CV1-59","CV1-60","CV1-61","CV1-62","CV1-63", "CV1-64","CV1-65","CV1-66","CV1-67","CV1-68","CV1-69","CV1-70","CV1-71", "CV1-72","CV1-73","CV1-74","CV1-75","CV1-76","CV1-77","CV1-78","CV1-79", "CV1-80","CV1-81","CV1-82","CV1-83","CV1-84","CV1-85","CV1-86","CV1-87", "CV1-88","CV1-89","CV1-90","CV1-91","CV1-92","CV1-93","CV1-94","CV1-95", "CV1-96","CV1-97","CV1-98","CV1-99","CV1-100"} compute c2={"CV2-1","CV2-2","CV2-3","CV2-4","CV2-5","CV2-6","CV2-7", "CV2-8","CV2-9","CV2-10","CV2-11","CV2-12","CV2-13","CV2-14","CV2-15", "CV2-16","CV2-17","CV2-18","CV2-19","CV2-20","CV2-21","CV2-22","CV2-23", "CV2-24","CV2-25","CV2-26","CV2-27","CV2-28","CV2-29","CV2-30","CV2-31", "CV2-32","CV2-33","CV2-34","CV2-35","CV2-36","CV2-37","CV2-38","CV2-39", "CV2-40","CV2-41","CV2-42","CV2-43","CV2-44","CV2-45","CV2-46","CV2-47", "CV2-48","CV2-49","CV2-50","CV2-51","CV2-52","CV2-53","CV2-54","CV2-55", "CV2-56","CV2-57","CV2-58","CV2-59","CV2-60","CV2-61","CV2-62","CV2-63", "CV2-64","CV2-65","CV2-66","CV2-67","CV2-68","CV2-69","CV2-70","CV2-71", "CV2-72","CV2-73","CV2-74","CV2-75","CV2-76","CV2-77","CV2-78","CV2-79", "CV2-80","CV2-81","CV2-82","CV2-83","CV2-84","CV2-85","CV2-86","CV2-87", "CV2-88","CV2-89","CV2-90","CV2-91","CV2-92","CV2-93","CV2-94","CV2-95", "CV2-96","CV2-97","CV2-98","CV2-99","CV2-100"} *--------------------------------------------------------------------------- * Kanonicke korelacije i testiranje njihove znacajnosti *--------------------------------------------------------------------------- compute eign=(1 &/ (1-dlam &**2)) - 1 compute wlam=1 &/ (1+eign) compute n=nrow(wlam) compute wilk=wlam compute df=wlam compute sig=wlam compute bart2=wlam compute tem=1 loop #l=1 to n + compute tem=tem*wlam(n-#l+1) + compute df(n-#l+1)=(p1-n+#l)*(p2-n+#l) + compute dof=df(n-#l+1) + compute bart2(n-#l+1)=-(ns-(p1+p2+3)/2)*ln(tem) + compute chi=bart2(n-#l+1) + compute sig(n-#l+1)=1-chicdf(chi,dof) + compute wilk(n-#l+1)=tem end loop compute test={dlam,wilk,bart2,df,sig} print test /format "f10.3" /title 'Koeficijenti kanonickih korelacija i njihova znacajnost:' /space 2/rnames=num /cnames={"Rho","Lambda","Hi2","df","sig"} release eign release wlam release wilk release df release bart2 release tem release test release dof release chi release dlam *------------------------------------------------------------------------- * Zadrzavanje znacajnih kanonickih korelacija *------------------------------------------------------------------------- compute cifra=make(n,1,0) compute inc=!inc loop s=1 to n do if sig(s,1) < inc + compute cifra(s,1)=1 end if end loop compute znac=csum(cifra) release sig release cifra do if znac > 0 *--------------------------------------------------------------------------- * Izracunavanje i stampanje kanonickih koeficijenata levog skupa varijabli *--------------------------------------------------------------------------- do if (p1 le p2) compute a=r1inv*u else compute a=r1inv*v end if do if (p2 lt p1) compute a=a(:,1:p2) end if compute aznac=a(:,1:znac) print aznac/format "f8.3" /title 'Kanonicki koeficijenti levog skupa varijabli' /space 2/rnames=nx1/cnames=num release r1inv *--------------------------------------------------------------------------- * Izracunavanje i stampanje kanonickih koeficijenata desnog skupa varijabli *--------------------------------------------------------------------------- do if (p1 le p2) compute b=r2inv*v else compute b=r2inv*u end if do if (p1 le p2) compute b=b(:,1:p1) end if compute bznac=b(:,1:znac) print bznac/format "f8.3" /title 'Kanonicki koeficijenti desnog skupa varijabli' /space 2/rnames=nx2/cnames=num release r2inv release v release u *--------------------------------------------------------------------------- * Izracunavanje i stampanje struktura kanonickih faktora levog * skupa varijabli *--------------------------------------------------------------------------- compute tem1=r11*a compute tem1z=tem1(:,1:znac) print tem1z /format "f8.3" /title 'Kanonicki faktori levog skupa varijabli' /space 2/rnames=nx1/cnames=num release tem1 *--------------------------------------------------------------------------- * Izracunavanje i stampanje struktura kanonickih faktora desnog * skupa varijabli *--------------------------------------------------------------------------- compute tem2=r22*b compute tem2z=tem2(:,1:znac) print tem2z /format "f8.3" /title 'Kanonicki faktori desnog skupa varijabli' /space 2/rnames=nx2/cnames=num release tem2 *--------------------------------------------------------------------------- * Izracunavanje i stampanje kanonickih kros-faktoralevog skupa varijabli *--------------------------------------------------------------------------- compute tem12=r12*b compute tem12z=tem12(:,1:znac) print tem12z /format "f8.3" /title 'Kanonicki kros-faktori levog skupa varijabli' /space 2/rnames=nx1/cnames=num release tem12 release b *--------------------------------------------------------------------------- * Izracunavanje i stampanje kanonickih kros-faktora desnog skupa varijabli *--------------------------------------------------------------------------- compute tem21=t(r12)*a compute tem21z=tem21(:,1:znac) print tem21z /format "f8.3" /title 'Kanonicki kros-faktori desnog skupa varijabli' /space 2/rnames=nx2/cnames=num release tem21 release a *---------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * levog skupa varijabli *---------------------------------------------------------------------------- compute f1=cssq(tem1z)/p1 compute f1=t(f1) compute jedanc=make(znac,1,1) compute alpha1=(p1/(p1-1))*(jedanc-jedanc&/t(cssq(tem1z))) compute cs3=cssq(tem12z)/p1 compute cs3=t(cs3) release tem12z *--------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * desnog skupa varijabli *--------------------------------------------------------------------------- compute f2=cssq(tem2z)/p2 compute f2=t(f2) compute alpha2=(p2/(p2-1))*(jedanc-jedanc&/t(cssq(tem2z))) compute cs4=cssq(tem21z)/p2 compute cs4=t(cs4) release tem21z release jedanc *--------------------------------------------------------------------------- * Stampanje rezultata analize prepokrivanja *--------------------------------------------------------------------------- print /title 'ANALIZA PREPOKRIVANJA:' /space 2 compute test1={f1, cs3, alpha1}. print test1/format "f15.3" /title 'Analiza prepokrivanja levog skupa' /space 2/rnames=c1 /cnames= {"Var.","Prepok.","General."} compute test2={f2, cs4, alpha2}. print test2/format "f15.3" /title 'Analiza prepokrivanja desnog skupa' /space 2/rnames=c2 /cnames= {"Var.","Prepok.","General."} release f1 release f2 release cs3 release cs4 release alpha1 release alpha2 release test1 release test2 else . print/title 'Nisu izdvojene statisticki znacajne kanonicke korelacije' end if print /title 'REZULTATI KANONICKE ANALIZE KOVARIJANSI:' /space 2 *--------------------------------------------------------------------------- * Singularna dekompozicija matrice r12 *--------------------------------------------------------------------------- call svd(r12,x1,lambda1,x2) *--------------------------------------------------------------------------- * Zadrzavaju se singularne vrednosti matrice r12 koje su vece od * aritmeticke sredine svih njenih singularnih vrednosti *--------------------------------------------------------------------------- compute dlam1=diag(lambda1) compute suma1=csum(dlam1) compute suma=suma1/n compute cifra1=make(n,1,0) loop s=1 to n do if dlam1(s,1) >= suma . compute cifra1(s,1)=1 end if end loop compute znacq=csum(cifra1) compute x1z=x1(:,1:znacq) compute x2z=x2(:,1:znacq) release dlam1 release x1 release x2 release lambda1 release cifra1 release suma release suma1 *--------------------------------------------------------------------------- * Izracunavanje i stampanje kvazikanonickih koeficijenata, sklopa, strukture, * interkorelacija zadrzanih kvazikanonickih faktora i testiranje i stampanje * njihove znacajnosti *--------------------------------------------------------------------------- compute c=t(x1z)*r12*x2z compute mm1=t(x1z)*r11*x1z compute mm2=t(x2z)*r22*x2z do if znacq > 1 compute d1=diag(mm1) compute d2=diag(mm2) compute d1=sqrt(d1) compute d1=1&/d1 compute d1=mdiag(d1) compute d2=sqrt(d2) compute d2=1&/d2 compute d2=mdiag(d2) compute m1=d1*mm1*d1 compute m2=d2*mm2*d2 compute invm1=inv(m1) compute invm2=inv(m2) compute c=diag(c) compute c=mdiag(c) compute f1=r11*x1z*d1 compute f2=r22*x2z*d2 compute a1=f1*invm1 compute a2=f2*invm2 compute ro=d1*c*d2 compute ro=diag(ro) compute ro2=ro&*ro compute f12=r12*x2z*d2 compute f21=r21*x1z*d1 compute df1=1 compute df2=ns-2 compute ftest1=make(znacq,1,1) compute ftest2=ftest1 compute sig1=ftest1 loop s=1 to znacq . compute ftest1(s,1)=ro2(s,1)*((ns-2)/(1-ro2(s,1))) . compute ftest2=ftest1(s,1) . compute sig1(s,1)=1-fcdf(ftest2,df1,df2) end loop compute lav={ro,ro2,ftest1,sig1} print lav/format "f8.3" /title 'Kvazikanonicke korelacije i testovi znacajnosti'/space=2 /rnames=num/cnames={"ro","ro2","f-test","sig"} print x1z/format "f7.3" /title 'Kvazikanonicki koeficijenti levog skupa varijabli' /rnames=nx1/cnames=num print a1/format "f7.3" /title 'Sklop levog skupa varijabli' /rnames=nx1/cnames=num print m1/format "f7.3" /title 'Interkorelacije levog skupa kvazikanonickih faktora' /rnames=num/cnames=num print f1/format "f7.3" /title 'Struktura levog skupa varijabli kvazikanonickih faktora' /rnames=nx1/cnames=num print f12/format "f7.3" /title 'Kros-struktura levog skupa' /rnames=nx1/cnames=num print x2z/format "f7.3" /title 'Kvazikanonicki koeficijenti desnog skupa varijabli' /rnames=nx2/cnames=num print a2/format "f7.3" /title 'Sklop desnog skupa varijabli' /rnames=nx2/cnames=num print m2/format "f7.3" /title 'Interkorelacije desnog skupa kvazikanonickih faktora' /rnames=num/cnames=num print f2/format "f7.3" /title 'Struktura desnog skupa varijabli kvazikanonickih faktora' /rnames=nx2/cnames=num print f21/format "f7.3" /title 'Kros-struktura desnog skupa' /rnames=nx2/cnames=num release invm1 release invm2 release m1 release m2 release c release a1 release a2 release ftest1 release ftest2 *--------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * levog skupa varijabli *--------------------------------------------------------------------------- compute jedan=make(znacq,1,1) compute red1=cssq(f1)/p1 compute red1=t(red1) compute red3=cssq(f12)/p1 compute red3=t(red3) compute beta1=(p1/(p1-1))*(jedan-jedan&/t(cssq(f1))) *--------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * desnog skupa varijabli *--------------------------------------------------------------------------- compute red2=cssq(f2)/p2 compute red2=t(red2) compute red4=cssq(f21)/p2 compute red4=t(red4) compute beta2=(p2/(p2-1))*(jedan-jedan&/t(cssq(f2))) *---------------------------------------------------------------------------- * Stampanje rezultata analize redundanci. *--------------------------------------------------------------------------- print /title 'ANALIZA PREPOKRIVANJA:' /space 2 compute test1={red1,red3,beta1}. print test1/format "f15.3" /title 'Analiza prepokrivanja levog skupa' /space 2/rnames=c1 /cnames= {"Varijansa","prepokrivanje","generalizabilnost"} compute test2={red2,red4,beta2} print test2/format "f15.3" /title 'Analiza prepokrivanja desnog skupa' /space 2/rnames=c2 /cnames= {"Varijansa","prepokrivanje","generalizabilnost"} else compute d1=sqrt(mm1) compute d2=sqrt(mm2) compute d1=1/d1 compute d2=1/d2 compute f1=r11*x1z*d1 compute f2=r22*x2z*d2 compute f12=r12*x2z*d2 compute f21=r21*x1z*d1 compute ro=d1*c*d2 compute ro2=ro*ro compute df2=ns-2 compute df1=1 compute ftest=ro2*(df2/(1-ro2)) compute sig1=1-fcdf(ftest,1,df2) compute lav={ro,ro2,ftest,df1,df2,sig1} print lav/format "f8.3" /title 'Kvazikanonicka korelacija i test znacajnosti'/space=2 /rnames=num/cnames={"ro","ro2","f-test","df1","df2","sig"} do if sig1 < !inc . compute levilav={x1z,f1,f12} . compute desnilav={x2z,f2,f21} print levilav/format "f10.3" /title 'Koeficijenti, struktura i krosstruktura levog skupa varijabli' /rnames=nx1/cnames={"X","F","F2"} print desnilav/format "f10.3" /title 'Koeficijenti, struktura i krosstruktura desnog skupa varijabli' /rnames=nx2/cnames={"X","F","F1"} else print/title 'Nisu izdvojene statisticki znacajne kvazikanonicke korelacije' end if release mm1 release mm2 *--------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * levog skupa varijabli *--------------------------------------------------------------------------- compute jedan=make(znacq,1,1) compute red1=cssq(f1)/p1 compute red1=t(red1) compute red3=cssq(f12)/p1 compute red3=t(red3) compute beta1=(p1/(p1-1))*(jedan-jedan&/t(cssq(f1))) *--------------------------------------------------------------------------- * Relativne varijanse, indeksi prepokrivanja i mere generalizabilnosti * desnog skupa varijabli *--------------------------------------------------------------------------- compute red2=cssq(f2)/p2 compute red2=t(red2) compute red4=cssq(f21)/p2 compute red4=t(red4) compute beta2=(p2/(p2-1))*(jedan-jedan&/t(cssq(f2))) *---------------------------------------------------------------------------- * Stampanje rezultata analize redundanci. *--------------------------------------------------------------------------- print /title 'ANALIZA PREPOKRIVANJA:' /space 2 compute test1={red1,red3,beta1}. print test1/format "f15.3" /title 'Analiza prepokrivanja levog skupa' /space 2/rnames=c1 /cnames= {"Var.","Prepok.","General."} compute test2={red2,red4,beta2}. print test2/format "f15.3" /title 'Analiza prepokrivanja desnog skupa' /space 2/rnames=c2 /cnames= {"Var.","Prepok.","General."} release df1 release df2 release test1 release test2 release sig1 release lav release red1 release red2 release red3 release red4 release beta1 release beta2 release r11 release r22 release r12 release r21 release nx1 release nx2 release jedan release ro release ro2 release d1 release d2 release x1z release x2z release f12 release f21 release ftest end if do if znac > 0 print /title 'RELACIJE KANONICKIH I KVAZIKANONICKIH FAKTORA:' /space 2 print /title '(Kanonicki faktori - redovi; kvazikan. faktori - kolone)' /space 2 *--------------------------------------------------------------------------- * Izracunavanje i stampanje korelacija izmedju kanonickih i * kvazikanonickih faktora u levom skupu varijabli *--------------------------------------------------------------------------- compute cq1=t(aznac)*f1 print cq1/format "f7.4" /title 'Korelacije levog skupa kanonickih i kvazikanonickih faktora' /space 2 /rnames=num /cnames=num release cq1 release aznac *--------------------------------------------------------------------------- * Izracunavanje i stampanje korelacija izmedju kanonickih i * kvazikanonickih faktora u desnom skupu varijabli *------------------------------------------------------------------------- compute cq2=t(bznac)*f2 print cq2/format "f7.4" /title 'Korelacije desnog skupa kanonickih i kvazikanonickih faktora' /space 2 /rnames=num /cnames=num release cq2 release bznac *------------------------------------------------------------------------- * Izracunavanje i stampanje Tucker-ovih koeficijenata kongruencije * kanonickih i kvazikanonickih faktora *-------------------------------------------------------------------------- compute g1=t(f1)*f1 compute g2=t(f2)*f2 do if znacq > 1 . compute g1=diag(g1) . compute g1=sqrt(g1) . compute g1=1&/g1 . compute g1=mdiag(g1) . compute g2=diag(g2) . compute g2=sqrt(g2) . compute g2=1&/g2 . compute g2=mdiag(g2) else . compute g1=sqrt(g1) . compute g1=1/g1 . compute g2=sqrt(g2) . compute g2=1/g2 end if compute h1=t(tem1z)*tem1z compute h2=t(tem2z)*tem2z do if znac > 1 . compute h1=diag(h1) . compute h1=sqrt(h1) . compute h1=1&/h1 . compute h1=mdiag(h1) . compute h2=diag(h2) . compute h2=sqrt(h2) . compute h2=1&/h2 . compute h2=mdiag(h2) else . compute h1=sqrt(h1) . compute h1=1/h1 . compute h2=sqrt(h2) . compute h2=1/h2 end if compute kong1=t(tem1z)*f1 compute kong1=h1*kong1*g1 compute kong2=t(tem2z)*f2 compute kong2=h2*kong2*g2 print kong1/format "f7.4" /title 'Kongruencija levog skupa kanonickih i kvazikanonickih faktora' /space 2 /rnames=num /cnames=num print kong2/format "f7.4" /title 'Kongruencije desnog skupa kanonickih i kvazikanonickih faktora' /space 2 /rnames=num /cnames=num end if end matrix *--------------------------------------------------------------------------- * Pozivanje i restrukturiranje originalnog fajla *--------------------------------------------------------------------------- get file='cc_tmp1.sav' restore !enddefine. restore