V. KESIMPULAN DAN SARAN 5.1
Kesimpulan Dua pendekatan dapat dilakukan untuk menangani ketidaknormalan data
pada pemodelan bilinier. Transformasi kenormalan dilakukan untuk tetap bertahan pada model dengan metode pendugaannya yang telah mapan secara teori sehingga pengujian hipotesis dan interpretasinya pun tidak banyak perdebatan. Model AMMI dibangun dengan landasan teori pemodelan yang mapan, teknik komputasi yang sederhana, dan telah secara luas digunakan. Transformasi data dilakukan untuk semata-mata memperoleh asumsi kenormalan. Analisis AMMI kemudian dilakukan pada data hasil transformasi ini. Kita seolah menutup mata terhadap makna apa yang diberikan oleh transformasi pada interpretasi model AMMI. Pada memodelan terampat, GAMMI atau GLM secara umum, transformasi bukanlah tidak dilakukan. Justru transformasi menjadi hal terpenting dalam model linier terampat. Transformasi dalam model linier terampat dipilih berdasarkan distribusi data, karenanya identifikasi distribusi menjadi sangat penting. Transformasi inilah yang memodelkan data berdasarkan fungsi peluangnya melalui fungsi hubung, dan secara teori interpretasi pemodelan inipun diturunkan berdasarkan fungsi peluang ini. Dengan bilinier terampat (GAMMI), kita sedang pemodelkan peluang, sehingga interpretasinya berkenaan dengan perbandingan peluang, odds dan rasio odds. Namun di sisi lain, transformasi ini juga yang menyebabkan dibutuhkannya metode pendugaan parameter yang lain (likelihood) bukan pendugaan dengan Metode Kuadrat Terkecil (MKT) biasa. Konsekuensi lain, model bilinier terampat khususnya, membutuhkan komputasi yang tidak sesederhana biasanya. Bila kita memilih transformasi kenormalan sebagai upaya penanganan datadata bukan Normal pada pemodelan bilinier, kita dapat menggunakan transformasi Box-Cox dan kemudian memodelkannya dengan AMMI, bila distribusi data yang kita miliki mendekati simetrik, sangat mirip dengan sebaran Normal. Hal ini disebabkan karena hasil AMMI dengan pendekatan transformasi Box-Cox tidak jauh berbeda dengan penggunan GAMMI. Namun bila distribusi
51
data bukan Normal kedua pendekatan ini mungkin memberikan hasil yang sangat berbeda. Hasil AMMI pada pendekatan transfomasi Box-Cox pada data rataan proporsi (berdistribusi Binomial) memberikan matriks interaksi dugaan yang berbeda dari model GAMMI logit-link. Pada data populasi hama (berdistribusi Poisson), AMMI dengan transformasi Box-Cox tidak banyak berbeda dengan model GAMMI log-link. Model GAMMI mampu mengakomodir ketidaknormalan data untuk memperoleh dekomposisi interaksi secara lengkap, dengan memodelkan peluang kejadian. Dalam bidang pemuliaan tanaman manfaat sangat dirasakan untuk uji stabilitas/adaptabilitas genotipe pada pebuah indikator yang berdistribusi bukan Normal, namun diketahui distribusinya dalam keluarga eksponnsial, misalnya Poisson, atau Binomial, Gamma. Biplot GAMMI model Poisson dengan fungsi hubung logaritma memberikan tambahan informasi tentang rasio odds. Informasi tentang rasio odds pada model log-bilinier tidak dapat diperoleh pada model AMMI dari data ternormalkan. Ini menjadi kelebihan model GAMMI log-link dibanding model AMMI dengan transformasi kenormalan pada data berdistribusi Poisson. Demikianlah model AMMI terampat (GAMMI) mampu memberikan informasi sebagaimana model AMMI, dengan keluasan distribusi peubah respon.
5.2
Saran Manfaat model GAMMI tidak terbatas pada masalah pemuliaan tanaman.
Model-model peluang pada tabel dua arah secara umum dapat kita jumpai pada masalah-masalah kesehatan (epidemiologi), riset pemasaran, ataupun pada bidang keteknikan. Penerapan model bilinier terampat ini diharapkan membuka peluang pengembangan lebih lanjut.
52
DAFTAR PUSTAKA Aunuddin, 2005. Statistika: Rancangan dan Analisis. IPB Press, Bogor. Bartlet, M. S. 1949. Fitting A Straitght Line When Both Variables Are Subject To Error. Biometrics, 5:207-212. Box, G. E. P, Hunter, W. G, & Hunter J. S. 1978. Statistics for Experimenters: An Introduction to Design, Data Analysis, and Model Building. John Wiley & Sons, Inc. Canada. Crossa, J. 1990.
Statistical Analysis for Multilocation Trials.
Advance in
Agronomy, 44: 55-85. Digby, P.G.N. & Kempton, R.A. 1987. Multivariate Analysis of Ecological Communities. Chapman & Hall, London. Falguerolles, de A, 1996. Generalized Linear-Bilinear Models. An Abstract. Society of Computational Economics. 2nd International Conference on Computing and Finance.
Genewa, Switzerland, 26–28 June 1996.
http://www.unige.ch/ce/ce96/defalgue/defalgue.htm. [14 Juli 2005] Gabriel, K. R., 1998, Generalised Bilinear Regression. Biometrika. 85 (3):689700. Greenacre, M. J. 1984. Theory and Apllications of Correspondence Analysis. Academic Press. London. Jolliffe, I T. 1986. Principal Component Analysis. Springer-Verlag. New York Lawes Agricultural Trust, 2003. The Guide to GenStat® Release 7.1 Part 2:
Statistics. VSN International, Wilkinson House, Jordan Hill Road, Oxford, UK. Mattjik A. A. & Sumertajaya I. M. 2002.
Perancangan Percobaan dengan
Aplikasi SAS dan MINITAB. 2nd Ed. IPB Press. Bogor. Mattjik A. A., 2005.
Interaksi Genotipe dan Lingkungan dalam Penyediaan
Suumberdaya Unggul.
Naskah Orasi Ilmiah Guru Besar Biometrika.
Fakultas Matematika dan Ilmu Pengetahuan Alam Institut Pertanian Bogor. Bogor. McCullagh, P. and Nelder, J. A. 1989. Chapman and Hall, London.
Generalized Linear Models. 2nd ed.
53
Rawling, J.O. Pantula S. G. & Dicky D. A, 1998. Applied Refression Analysis: A Research Tools. 2nd Ed. Sringer-Verlag, New York. Sumertajaya, I M. 1998. Perbandingan Model AMMI dan Regresi Linier untuk Menerangkan Pengaruh Interaksi Percobaan Lokasi Ganda. Tesis. Program Studi Statistika Sekolah Pascasarjana IPB, Bogor Tengkano, W & Soehardjan, M, 1993. Jenis Hama Utama pada Berbagai Fase Pertumbuhan Tanaman Kedelai, dalam S. Somaatmadja et al (eds.) Kedelai. Pusat Penelitian dan Pengembangan Tanaman Pangan. Bogor Van Eeuwijk, F A, 1995.
Multiplicative Interaction in Generalized Linear
Models. Biometrics, 51, 1017–1032
LAMPIRAN
55
Lampiran 1. Data pengamatan populasi hama daun kedelai pada umur 14 hari setelah tanam Genotipe
Ulangan
IAC-100
1 2 3 4 IAC-100 1 2 3 4 IAC-80 1 2 3 4 W/80 1 2 3 4 Wilis
Rataan IAC-80
Rataan W/80
Rataan Wilis
Rataan
Hama Daun Bemissia 0 1 1 0 0.5 4 2 2 4 3 3 3 2 6 3.5 6 5 1 4 4
Emproosca 2 2 2 1 1.75 5 3 2 1 2.75 6 4 3 3 4 3 3 3 3 3
Agomyza 1 2 4 2 2.25 2 1 1 0 1 2 1 1 1 1.25 0 0 2 2 1
Lamprosema Longitarsaus 1 0 1 2 0 2 0 3 0.5 1.75 3 4 2 3 1 2 1 4 1.75 3.25 1 3 3 2 2 2 2 1 2 2 2 4 3 4 1 5 1 3 1.75 4
Lampiran 2. Nilai lambda dugaan dan log-likelihood transformasi Box-Cox data populasi hama daun lambda 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Lampiran
-0.99 -0.44 0.11 0.66 1.21 1.76 2.31 2.86 3.41 3.96 4.50 5.05 5.60 6.15 6.70 7.25 7.80 8.35 8.90 9.45 10.00
Box-Cox Likelihood -22.22 -16.28 -12.77 -11.67 -12.57 -14.95 -18.37 -22.53 -27.25 -32.41 -37.90 -43.68 -49.68 -55.87 -62.23 -68.72 -75.32 -82.03 -88.83 -95.70 -102.64
56
Lampiran 3. Plot sisaan model AMMI 2 data populasi hama daun ternormalkan. 2.0
Standardized residuals
7 6 5 4 3 2 1
1.5 1.0 0.5 0.0 -0.5 -1.0 -1.5 -2.0
0 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0
0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50
Standardized residuals
Fitted values
az
az Standardized residuals
2.0 1.5 1.0 0.5 0.0 -0.5 -1.0 -1.5 -2.0
1.75 1.50 1.25 1.00 0.75 0.50 0.25 0.00
-2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0
Normal plot
0.0
0.5
1.0
1.5
2.0
Half-Normal plot
Lampiran 4. Nilai lambda dugaan dan log-likelihood transformasi Box-Cox data proporsi gabah isi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Lampiran
lambda -0.99 -0.44 0.11 0.66 1.21 1.76 2.31 2.86 3.41 3.96 4.50 5.05 5.60 6.15 6.70 7.25 7.80 8.35 8.90 9.45 10.00
Box-Cox Likelihood 150.29 151.70 152.99 154.16 155.21 156.16 157.01 157.75 158.41 158.97 159.45 159.85 160.18 160.43 160.61 160.73 160.79 160.78 160.73 160.61 160.45
57
Standardized residuals
Lampiran 5. Diagnostik sisaan AMMI data gabah isi ternormalkan
20
15
10
5
2 1 0 -1 -2 -3
0 -3
-1
-2
0
1
2
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8
3
Standardized residuals
Fitted values
pz
pz 3.0
Standardized residuals
2 1 0 -1 -2 -3
2.5 2.0 1.5 1.0 0.5 0.0
-2
-1
0
2
1
0.0
0.5
Normal plot
1.0
1.5
2.0
2.5
Half-Normal plot
Lampiran 6. Biplot AMMI1: KUI1 vs rataan proporsi gabah isi ternormalkan 0.5
Maroangin
0.4
C
G
0.3 Paritdalam
0.2
L
KUI1
0.1 M
0.0
A
B
Talang D H
-0.1
K
J F
-0.2
Jatibaru
E Maranu
-0.3 -0.4 0.3
0.4
0.5 Gabah Isi Padi
Lampiran
0.6
0.7
58
Lampiran 7. Biplot AMMI1: KUI1 vs rataan populasi hama daun ternormalkan
KUI1
1
IAC-100 Agromyza
Emproasca Longitarsus
0 IAC-80
Lamprosema
W/80 Wilis Bemissia -1 1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0
Populasi Hama Daun
Lampiran 8. Karakteristik distribusi data hama daun
Descriptive Statistics Variable: a
0.5
1.5
2.5
3.5
Mean StDev Variance Skewness Kurtosis N
2.25000 1.13555 1.28947 0.153511 -1.05533 20
Minimum 1st Quartile Median 3rd Quartile Maximum
0.50000 1.37500 2.00000 3.18750 4.00000
Lampiran 9. Contoh perintah GENSTAT untuk transformasi Box-Cox YTRANSFORM [transform=powe;method=boxc;lower=0.99;upper=10]y=gbhisi;nbin=nY;\ save=bxc print bxc[1, 2, 3, 4]; variate Z calc Z=gbhisi**1.21 normtest [print=marg, critical]data=Z print Y, Z
Lampiran
59
Lampiran 10. Prosedur GAMMI pada GENSTAT 7 \next procedure PROCEDURE 'GAMMI' " Performs a generalized linear additive main effects and multiplicative interaction model analysis for row-by-COLUMN data; FAE 1/1/93" " with compliments to scaffold RJOINT of PWL by PK 1/4/93" " all rights reserved by F.A. van Eeuwijk & L.C.P. Keizer" " CPRO-DLO Wageningen 30-MAY-1996 test version" " Updated for full parameter names by LCPK 17/5/2005" " Updated for full model by AFHADI 21/8/2005" " Other procedures used; RCHECK" OPTION \ 'PRINT', "I: strings (model,summary,diagnostics,biplots,monitoring); output from procedure; default m,s,d,b"\ 'DISTRIBUTION', "I:string (normal,poisson,binomial,gamma, inversenormal);distribution for response;default n"\ 'LINK', "I: string (canonical,identity,log,logit,reciprocal, power,squareroot,probit,complementaryloglog); link function; default canonical"\ 'EXPONENT', "I: scalar; exponent for power link; default -2"\ 'DISPERSION', "I: scalar; dispersion parameter; default * for DISTRIBUTION=n,g,i or 1 for DISTRIBUTION=p,b"\ 'WEIGHTS', "I: variate; holding the weights for each unit"\ 'AXES', "I: scalar; number of multiplicative axes to be used"\ 'MAINEFFECTS', "I: text; substract ROW and/or COLUMN main effects before adding multiplicative terms"\ 'COVA_IMPL', "I: string; cova implemented before or after main effect or used for redundancy analysis"\ 'TOLERANCE', "I: scalar; the convergence criterion; default 0.00001"\ 'SEED', "I: scalar; to initialize the COLUMN scores"\ 'MAXCYCLE'; "I: scalar; maximum number of cycles; default 15"\ MODE =t,t,t,v,p,p,p,t,t,v,v,v;\ NVALUES =*,1,1,1,1,*,1,*,*,1,1,1;\ SET =n,y,y,y,n,n,y,y,y,y,y,y;\ VALUES =!t(MODEL,SUMMARY,DIAGNOSTICS,BIPLOTS,MONITORING),\ !t(NORMAL,POISSON,BINOMIAL,GAMMA,INVERSENORMAL),\ !t(CANONICAL,IDENTITY,LOGARITHM,LOGIT,RECIPROCAL,POWER,\ SQUAREROOT,PROBIT,COMPLEMENT),\ *,*,*,*,\ !t(ROW,COLUMN,BOTH,NONE),\ !t(BEFORE,AFTER,REDUNDANCY),\ *,*,*;\ DEFAULT =!t(MODEL,SUMMARY,DIAGNOSTICS,BIPLOTS),\ 'NORMAL','CANONICAL',-2,*,*,2,!t(BOTH),'AFTER',\ 0.00001,13132,15;\ LIST =y,(n)11 PARAMETER \ 'Y', "I: variate; variate to be analysed; no default"\ 'NBINOMIAL', "I: variate; variate of binomial totals; no default for DISTRIBUTION=b"\ 'ROW', "I: factor; the row factor; no default"\ 'COLUMN', "I: factor; the COLUMN factor; no default"\ 'COVARIATES', "I: pointer of variates; associated with the row factor"\ 'COVATYPE',"I: pointer of ROW or COL dummies; covas are associated with"\ 'ROWPARAMS', "O: pointer; to store estimates of the ROW means"\ 'COLPARAMS', "O: pointer; to store estimates of the COLUMN means"\ 'FITTEDVALUES', "O: variate; to store fitted values"\ 'RESIDUALS', "O: variate; to store residuals"\ 'DELRESIDUALS', "O: variate; to store deletion residuals"\ 'COOK', "O: variate; to store modified Cook's statistics"\ 'LEVERAGE', "O: variate; to store leverage values"\ 'WORKVARIATE', "O: variate; to store working variate"\ 'LINEARPREDICT',"O: variate; to store linear predictor"\
Lampiran
60 'BIPLOT'; SET DECLARED PRESENT TYPE
"O: pointer; to store R&C+R+C biplots sigma scaled"\ =y,n,y,y,n,n,n,n,n,n,n,n,n,n,n,n;\ =y,y,y,y,n,n,n,n,n,n,n,n,n,n,n,n;\ =y,y,y,y,n,n,n,n,n,n,n,n,n,n,n,n;\ =2('VARIATE','FACTOR'),'POINTER','POINTER',\ 2('POINTER'),7('VARIATE'),'POINTER' TEXT e; VALUES='FAULT message from procedure gammi: ' TEXT w; VALUES='WARNING message from procedure gammi: ' "**********************************************************************" " Deal with DISPERSION option " "prin [ipri=*;squa=y] 'check dispersion'" IF UNSET(DISPERSION) " Option not set " IF DISTRIBUTION.IN.!t(BINOMIAL,POISSON) SCAL [VALUE=1] disp ELSE SCAL [VALUE=*] disp ENDI ELSE IF DISPERSION>0 " Option set positive " SCAL [VALU=DISPERSION] disp ELSI DISPERSION==CONS('*') " Option set to * " SCAL [VALU=*] disp ELSE " Option set negative " EXIT [CONT=proc; EXPL=!t(#e,'DISPERSION must be positive or *')] ENDI ENDI "***********************************************************************" prin [ipri=*;squa=y] 'check weights' IF UNSET(WEIGHTS) " Option not set " VARI [nval=Y] weights CALC weights=1 DUMM [valu=NONE] WEIGHTS ELSE VARI weights ; WEIGHTS ENDI prin [ipri=*;squa=y] 'check weights' "when calculating df's take care for 0 weight's" "***********************************************************************" " Deal with NBINOMIAL parameter " "prin [ipri=*;squa=y] 'check nbinomial parameter'" IF UNSET(NBINOMIAL) EXIT [CONT=proc; EXPL=!t(#e,'NBINOMIAL parameter must be set')] \ DISTRIBUTION .EQS. 'BINOMIAL' " Assign a variate with values to NBIN: will be ignored " ASSI Y; NBINOMIAL ENDI "***********************************************************************" " Look for the canonical link of the specified distribution " "prin [ipri=*;squa=y] 'check cononical link'" SCAL ndist,nlink TEXT [VALUES=IDENTITY,LOGARITHM,LOGIT,RECIPROCAL,POWER,SQUAREROOT,PROBIT,\ COMPLEMENTARYLOGLOG] linkname CALC ndist = POSITION(DISTRIBUTION; !t(NORMAL,POISSON,BINOMIAL,\ GAMMA,INVERSENORMAL)) IF LINK.EQS.'CANONICAL' SCAL nlink; VALUE=ndist ELSE CALC nlink = POSITION(LINK; linkname) ENDI "***********************************************************************" " Get attributes of factors, particularly for labelling " "prin [ipri=*;squa=y] 'check attributes for labelling'" GETA [ATTR=nlevels,levels,labels] ROW,COLUMN; SAVE=pvf,pef
Lampiran
61 SCAL nvars,nenvs; VALUE=pvf['nlevels'],pef['nlevels'] GETA [ATT=nmv] pvf,pef; SAVE=ppvf,ppef "check for levels or labels" IF ppvf[1] GETA [ATT=decimals] pvf['levels']; SAVE=ppvf VARI Row; VALUES=pvf['levels']; DECI=ppvf['decimals'] FACT [LEVE=Row] Grow; VALU=pvf['levels'] ELSE TEXT Row; VALUES=pvf['labels'] TEXT Grow; VALU=pvf['labels'] ENDI IF ppef[1] GETA [ATTR=decimals] pef['levels']; SAVE=ppef VARI Column; VALU=pef['levels']; DECI=ppef['decimals'] FACT [LEVE=Column] Gcolumn;VALU=pef['levels'] ELSE TEXT Column; VALU=pef['labels'] TEXT Gcolumn; VALU=pef['labels'] ENDI TEXT [NVAL=1] variden,enviden,covviden,coveiden "dump hiet niet meer nodig door loop die de fits doet" DUMP [CHAN=chanenv;PRIN=iden] COLUMN DUMP [CHAN=chanvar;PRIN=iden] ROW EQUA [OLDF=!(-5,1,*)] chanenv,chanvar;variden,enviden "***********************************************************************" " Identify missing ROWs and COLUMNs (e.g. due to restrict) " "prin [ipri=*;squa=y] 'check missing ROWs and COLUMNs'" TABU & REST & CALC CALC
[CLAS=ROW] Y; NOBS=cv [CLAS=COLUMN] Y; NOBS=ce Column; !(#ce)>0 Row; !(#cv)>0 notmise,notmisv=nval(Column,Row) "Get number of not restricted" totnmis=nobs(Y/weights) "Available df's" "takes in account missing values in Y and those due to 0 weights" "***********************************************************************" "check on covar; Column cova's optionally fitted before main Column eff. with a maximum equaling column levels (poss. -1 for general mean); Row cova's may follow similar but adjusted for Column effects (=Rowlevels-1)" "A mirror analysis can be prefomed by transposing the input" VARI [nval=Y] eenvec "unity vector used as dummy and/or to fit mean" CALC eenvec=1 SCAL cdf,rdf;notmise,notmisv "column/row counters used for df calcs" SCAL mcdf[1...nenvs],mrdf[1...nvars];1 "individual main effects/coverdfs" "prin 'check met covariabelen'" IF UNSET(COVARIATES) ASSI eenvec; COVARIATES;1 ASSI eenvec; COVATYPE;1 scal covatal;1 POIN [valu=eenvec] covar SCAL thch,thrh,ccp,rcp;0 ELSE CALC covatal,cotyptal=nval(COVARIATES,COVATYPE) EXIT [CONT=JOB;EXPL=!t(#e,\ 'Pointer COVARIATE and COVATYPE must have same number of values')]\ covatal.ne.cotyptal CALC ctlev[1...covatal]=nlev(COVATYPE[1...covatal]) CALC cvvtal[1...covatal]=nval(COVARIATES[1...covatal]) CALC ctlctv[1...covatal]=ctlev[].EQ.cvvtal[] EXIT [CONT=JOB;EXPL=!t(#e,\ 'COVARIATE length must conform levels of corresp. factor')]\ vsum(ctlctv).ne.covatal "find out wich covariate belongs to column or row" CALC hch[1...covatal]=COVATYPE[1...covatal].IS.COLUMN CALC hrh[1...covatal]=COVATYPE[1...covatal].IS.ROW
Lampiran
62 "create index variate for column and row" VARI vhch,vhrh;VALU=!(hch[]),!(hrh[]) CALC vhch,vhrh=cum(vhch,vhrh)*(vhch,vhrh.ne.0) "determine presency of column/row covariate" CALC thch,thrh=VSUM(hch,hrh) "when present assign column and row covariates each to a pointer; when not present assign dummy eenvec to these pointers (used as fit-loop index parameter but skiped within the loop) and erect the full length covariate for analysis" IF thch.gt.0 POIN [nval=thch] chcova ASSI COVARIATES[#vhch];(chcova)#thch;1...thch CALC ccovar[1...thch] = \ NEWLEVELS(COVATYPE[#vhch];COVARIATES[#vhch]) ELSE POIN [valu=eenvec] chcova POIN [valu=eenvec] ccovar ENDI IF thrh.gt.0 POIN [nval=thrh] rhcova ASSI COVARIATES[#vhrh];(rhcova)#thrh;1...thrh CALC rcovar[1...thrh] = \ NEWLEVELS(COVATYPE[#vhrh];COVARIATES[#vhrh]) ELSE POIN [valu=eenvec] rhcova POIN [valu=eenvec] rcovar ENDI "calculate scalars used to skip elements as loop index parameter" CALC ccp,rcp=thch,thrh.ne.0 "correct scalars used as index for pointers; ensuring them being >0 to avoid trouble with nonexisting index for empty pointers" CALC thch,thrh=thch,thrh+(thch,thrh.eq.0) ENDI "***********************************************************************" "Temporary inclusion of main effects fitting order !!!!!" " to be deleted when module is up and running" MODE [DIST=#DISTRIBUTION; LINK=#LINK; EXPO=EXPONENT; DISP=disp; WEIG=weights]\ Y; NBIN=NBINOMIAL TERM COLUMN+ROW FIT [PRIN=*] ADD [PRIN=*] COLUMN ADD [PRIN=*] ROW " DROP [PRIN=*] ROW+COLUMN ADD [PRIN=*] ROW ADD [PRIN=A] COLUMN " "***********************************************************************" SCAL efftal;0 "scalar counting fitted effects" SCAL mas;1 "initial multiplicative AXES use in effects pointer" SCAL einp,ginp;0 "indicator if geno/environmental effects are present" SCAL gmean "scalar for general mean" TEXT [VALU='Total'] source "declaration of variates holding estimates" VARI [VALU=#nenvs(0)] E VARI [VALU=#nvars(0)] G VARI [NVAL=Y] voG,voE SCAL YE[1...thch] "column covariable effects" SCAL ZE[1...thrh] "row covariable effects" POIN [nval=1] gefp,refp,cefp "pointer to hold effects" ASSI (gmean)3;gefp,refp,cefp POIN voGp "pointer to maineffect offset" POIN voEp "pointer to maineffect offset" "**********************************************************************"
Lampiran
63 "Fitting general mean; keeping devi & df for accumulated table" MODE [DIST=#DISTRIBUTION; LINK=#LINK; EXPO=EXPONENT; DISP=disp; WEIG=weights;\ SAVE=laatst] Y; NBIN=NBINOMIAL FORM [VALU=eenvec] fform,fformeas,fformvas,fformc,fformr FIT [PRIN=*;CONS=O] #fform RKEE DEVI=devi[efftal]; DF=df[efftal];est=est CALC totdf[efftal]=notmise*notmisv-1 "calculate total df" IF df[efftal].ne.totdf[efftal] "not sure yet how to deal with" CALC totmis=totdf[efftal]-df[efftal] PRIN 'Specific ROW-COLUMN cells are restricted or missing !!!!!' ELSE SCAL totmis;0 ENDI "***********************************************************************" "***********************************************************************" "Fitting covar & main effects; keeping devi & df for accumulated table" "i= variates/factors to be fitted j= column or row factor to wich the fitted variate corresponds k= given choices for fitting the covariates l= possible choices at each stage of fitting m= index number for covariate n= type of effect to be fitted (cova,main,cova.main) o= corresponding identifier of covariate/factor use in summary table" FOR i=#ccp(ccovar[1...thch]),COLUMN,\ #rcp(rcovar[1...thrh]),ROW,\ #ccp(ccovar[1...thch]),\ #rcp(rcovar[1...thrh]);\ j=#ccp((COLUMN)#thch),COLUMN,\ #rcp((ROW)#thrh),ROW,\ #ccp((ROW)#thch),\ #rcp((COLUMN)#thrh);\ k=#ccp(COVA_IMPL),MAINEFFECTS,\ #rcp(COVA_IMPL),MAINEFFECTS,\ #ccp(COVA_IMPL),\ #rcp(COVA_IMPL);\ l=#ccp('BEFORE'),!T('COLUMN','BOTH'),\ #rcp('BEFORE'),!T('ROW','BOTH'),\ #ccp(!T('BEFORE','AFTER')),\ #rcp(!T('BEFORE','AFTER'));\ m=#ccp(1...thch),1,\ #rcp(1...thrh),1,\ #ccp(1...thch),\ #rcp(1...thrh);\ n=#ccp((1)#thch),2,\ #rcp((3)#thrh),4,\ #ccp((5)#thch),\ #rcp((6)#thrh);\ o=#ccp(chcova[1...thch]),COLUMN,\ #rcp(rhcova[1...thrh]),ROW,\ #ccp(chcova[1...thch]),\ #rcp(rhcova[1...thrh]); IF (k.IN.l) "check to include covariate/factor at this stage" CALC mindf[1,2]=(n,n.eq.1,3)*\ (mcdf[m],mrdf[m])*(vsum(mcdf,mrdf).gt.1) " (cova = 1df unless (rtot/ctot-1) or already fitted)" CALC mindf[1,2]=mindf[1,2]+(n,n.eq.2,4)*(vsum(mcdf,mrdf)-1) "main = rtot/ctot-1 corrected for covariates already fitted" CALC mindf[1,2]=mindf[1,2]+\ (n,n.eq.5,6)*(rdf,cdf-(mcdf[m],mrdf[m].eq.0)) "cova.main = complementary factor df corrected for not fitted covariate and/or maineffect" EXIT [CONT=FOR;EXPL=!t(#w,\ 'Not enough df to fit all requested terms')]\
Lampiran
64 (totdf[efftal]-vsum(mindf)-totmis).le.0 "rem: totmis indicates missing cells" IF (VSUM(mindf).gt.0) "if possible to include then correct dfs" "adjust pointers to hold effects !!!" CASE n POIN [valu=gefp[],YE[]] gefp POIN [valu=cefp[],YE[]] cefp POIN [valu=refp[],YE[]] refp OR POIN [valu=gefp[],E] gefp POIN [valu=cefp[],E] cefp CALC einp=1 POIN [valu=voE] voEp OR POIN [valu=gefp[],ZE[]] gefp POIN [valu=cefp[],ZE[]] cefp POIN [valu=refp[],ZE[]] refp OR POIN [valu=gefp[],G] gefp POIN [valu=refp[],G] refp CALC ginp=1 POIN [valu=voG] voGp ELSE prin 'How does the effects pointer has to look like ?' ENDC CALC mefftal,efftal=efftal,efftal+0,1 CALC totdf[efftal]=totdf[mefftal]-vsum(mindf) CALC mcdf[m],mrdf[m]=mcdf[m],mrdf[m]-(n,n.eq.1,3) CALC mcdf[1...nenvs],mrdf[1...nvars]=\ mcdf[1...nenvs],mrdf[1...nvars]-\ mcdf[1...nenvs],mrdf[1...nvars]*\ ((n)#nenvs,(n)#nvars.eq.(2)#nenvs,(4)#nvars) CALC cdf,rdf=cdf,rdf-(n,n.eq.2,4) "correct for main effects" CALC cdf,rdf=cdf,rdf-(n,n.eq.5,6) "correct for main.cova effects" DUMP [CHAN=chancove;PRIN=iden] o EQUA [OLDF=!(-5,1,*)] chancove;coveiden TEXT [VALU=#source,#coveiden] source fcla i;outt=iform fcla j;outt=jform IF (n.gt.4) "is it an cova.main type ?" FORM [VALU=#fform+#jform.#iform] fform ELSE "it is just an additive" FORM [VALU=#fform+#iform] fform ENDI IF (j.IS.ROW) IF (n.gt.4) FORM [valu=#fformc+#jform.#iform] fformc ELSE FORM [valu=#fformc+#iform] fformc ENDI ELSE IF (n.gt.4) FORM [valu=#fformr+#jform.#iform] fformr ELSE FORM [valu=#fformr+#iform] fformr ENDI ENDI FIT [PRIN=*;CONS=O] #fform RKEE DEVI=devi[efftal]; DF=df[efftal];ESTI=est ENDI ENDI ENDF "***********************************************************************"
Lampiran
65 "Calculating initial values for offset" " prin [squa=y] fform rdis [prin=es;save=laatst] " EQUA est;gefp IF einp CALC voE=NEWL(COLUMN;E) ENDI "***********************************************************************" "check on realistic number of multipl. axes after covariate/main effects" CALC haxes=vmin(!p(cdf,rdf)) "smallest side is maximum" IF haxes.lt.AXES CALC AXES=haxes PRIN [ipri=*;squa=y] w,\ 'Not enough df''''s; number of axes set to:',AXES;\ fiel=*,*,3;deci=0 ENDI "***********************************************************************" "prin [ipri=*;squa=y] 'Begin module'" "prin [ipri=*;squa=y] 'nvars',nvars,'nenvs',nenvs" "prin [ipri=*;squa=y] 'AXES=:',AXES" CALC SEED=URAN(SEED) "initialize random generator" CALC delta[1...AXES] = URAN(0;nenvs) "initialize COLUMN scores" "CALC delta[1...AXES]=delta[1...AXES]-mean(delta[1...AXES])" "probeersel" calc delta[1...AXES]=0 "DIT WERKT, maar geeft dit geen problemen ??" VARI [NVAL=nvars] gamma[1...AXES] "***********************************************************************" "prin [ipri=*;squa=y] 'check lege parameters (assign)'" IF UNSET(FITTEDVALUES) : ASSIGN fit ; FITTEDVALUES : ENDI IF UNSET(RESIDUALS) : ASSIGN residual; RESIDUALS : ENDI IF UNSET(DELRESIDUALS) : ASSIGN delres ; DELRESIDUALS : ENDI IF UNSET(COOK) : ASSIGN cook ; COOK : ENDI IF UNSET(LEVERAGE) : ASSIGN leverage; LEVERAGE : ENDI IF UNSET(WORKVARIATE) : ASSIGN workvar ; WORKVARIATE : ENDI IF UNSET(LINEARPREDICT) : ASSIGN lp ; LINEARPREDICT : ENDI IF UNSET(BIPLOT) : ASSIGN biplot ; BIPLOT ELSE CALC BIPLTAL=AXES*4 IF NVAL(BIPLOT)<>BIPLTAL \EXIT [CONT=proc;EXPL=!t(#e,\ \'Biplot pointer must have 4 variates per axis (R&C+R+C)')] prin [ipri=*;squa=yes]\ 'Biplot pointer has 4 variates per axis (R&C+R+C):',BIPLTAL,\ 'for',AXES,'axes';deci=0;fiel=1 POIN [modi=yes;nval=BIPLTAL] BIPLOT ENDI ENDI "***********************************************************************" VARI [NVAL=Y] vint[1...AXES],vdelta[1...AXES],vgamma[1...AXES] "redefine" SCAL cycle,tcycle,devmon[0]; 0 CALC axesmin=AXES-1 "prin [ipri=*;squa=y] 'Begin loop'" "***********************************************************************" IF AXES.GE.1 FOR m=1...AXES "buitenloop voor aantal assen" CALC mas=m CALC tcycle,cycle,mmin=tcycle,0,m+cycle,0,-1 FORM [valu=#fformc+ROW.vdelta[1...m]] fformeas FORM [valu=#fformr+COLUMN.vgamma[1...m]] fformvas POIN [VALU=refp[],gamma[1...m]] refpp
Lampiran
66 POIN [VALU=cefp[],delta[1...m]] cefpp " prin [squa=y] 'samengestelde poin' prin [squa=y] fformeas prin [squa=y] refpp prin [squa=y] fformvas prin [squa=y] cefpp " "***********************************************************************" FOR [NTIM=MAXCYCLE] CALC cycle = cycle+1 MODE [DIST=#DISTRIBUTION; LINK=#LINK; EXPO=#EXPONENT; \ DISP=disp; WEIG=weights ;OFFS=#voEp] Y; NBIN=NBINOMIAL " Form variate with current ROW sens relevant to each unit " " Avoid bug with restrictions in NEWLEVELS " REST delta[1...m] CALC vdelta[1...m] = NEWLEVELS(COLUMN;delta[1...m]) REST delta[1...m]; RESTRICT(Column) FIT [CONST=O; PRIN=*;NOME=alia] #fformeas RKEE EST=est; DEV=rdevmon[cycle] EQUA est; refpp "prin refpp[]" CALC G,gamma[1...m] = G,gamma[1...m]-MEAN(G,gamma[1...m]) CALC voG = NEWL(ROW;G) "orthogonalisatie" "bedoeling is GRAMM-SCHMIDT orthogonalisatie" "hier nog CHOLESKI ??" IF m.gt.1 for i=1...mmin;j=2...m model gamma[j]; fit=fitg FIT [CONST=o; PRIN=*] gamma[1...i] CALC gamma[j] = gamma[j] - fitg endf ENDI CALC normgamma[1...m] = SQRT(sum(gamma[1...m]**2)) CALC gamma[1...m] = gamma[1...m]/normgamma[1...m] REST gamma[1...m] CALC vgamma[1...m] = NEWL(ROW;gamma[1...m]) REST gamma[1...m];REST(Row) MODE [DIST=#DISTRIBUTION; LINK=#LINK; EXPO=#EXPONENT; \ DISP=disp; WEIG=weights ;OFFS=#voGp;SAVE=laatst] Y; NBIN=NBINOMIAL FIT [CONS=O; PRIN=*] #fformvas RKEE EST=est; DEV=cdevmon[cycle] EQUA est;cefpp "prin cefpp[]" CALC E,delta[1...m] = E,delta[1...m] - MEAN(E,delta[1...m]) CALC voE = NEWL(COLUMN;E) "orthogonalisatie" IF m.gt.1 for i=1...mmin;j=2...m MODE delta[j]; FIT=fitd FIT [CONST=o; PRIN=*] delta[1...i] CALC delta[j] = delta[j] - fitd endf ENDI CALC normdelta[1...m] = SQRT(SUM(delta[1...m]**2)) CALC delta[1...m] = delta[1...m]/normdelta[1...m] "***********************************************************************" CALC maxdiff= ABS(rdevmon[cycle]-cdevmon[cycle]) IF 'MONITORI' .IN. PRINT PRIN [ipri=*;squa=y] \ 'AXES:',m,'convergence cycle:',cycle,\ 'Deviance:',cdevmon[cycle],'Difference:',maxdiff;\ deci=*,0,*,0,*,4,*,4;fiel=*,2,*,3,*,12,*,12 ENDI
Lampiran
67 EXIT [CONT=FOR] maxdiff .LT. TOLERANCE "***********************************************************************" IF cycle==MAXCYCLE PRINT [IPRINT=*] '******** CONVERGENCE NOT ACHIEVED IN', \ cycle,'ITERATIONS'; FIELD=3; DEC=0 & [SQUASH=yes] 'Tolerance',TOLERANCE, \ 'Maximum difference in sensitivity at last iteration',maxdiff; \ FIELD=18,12,37,12 ENDIF ENDF "***********************************************************************" "prin gamma[1...m],delta[1...m]" CALC sgamma[m][1...m],sdelta[m][1...m]=gamma[1...m],delta[1...m] CALC sE[m],sG[m]=E,G CALC sgmean[m]=gmean "opslag per as" CALC mefftal,efftal=efftal,efftal+0,1 CALC devi[efftal]=cdevmon[cycle] CALC df[efftal]=df[mefftal]-(cdf+rdf-1) CALC cdf,rdf=cdf,rdf-1 CALC phi[m][1...m]=normdelta[1...m] " prin [squa=y] normdelta[1...m] prin [squa=y] normgamma[1...m] " IF 'MONITORI' .IN. PRINT TEXT [VALU='Monitor convergence graph'] gt VARI [nval=cycle] process;!(cdevmon[1...cycle]) VARI [valu=1...cycle] round;deci=0 GRAP [titl=gt] process;round;meth=l ENDI ENDF "***********************************************************************" "prin [ipri=*;squa=y] 'Einde loop'" "prin efftal" ENDI "***********************************************************************" "prin 'rcheck'" "Extract relevant details from last fit and use RCHECK" " RDIS [SAVE=laatst;PRIN=esti] prin refpp[],cefpp[],'dit moet kloppen met de estimates' " RKEE [SAVE=laatst] LINE=LINEARPREDICT;LEVE=LEVERAGE;\ FITT=FITTEDVALUES;RESI=RESIDUALS CALC RESIDUALS=Y-FITTEDVALUES "aanpassing residu zonder leverage etc" RCHECK [SAVE=laatst;PRIN=*;resi=DELRESIDUALS;cook=COOK] " residual,cook,leverage; halfnormal" CALC WORKVARIATE = LINEARPREDICT + (Y - FITTEDVALUES)/FITTEDVALUES PRIN [CHAN=asnum;IPRI=*;SQUA=Y] !(1...AXES);deci=0;fiel=2;just=l "***********************************************************************" TABU [CLASS=ROW,COLUMN; MARG=Y; PRIN=M] FITTEDVALUES "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" PRIN sgmean[] PRIN Row,sG[1...AXES],sgamma[][] CORR [PRIN=c] sG[1...AXES],sgamma[][] PRIN Column,sE[1...AXES],sdelta[][] CORR [PRIN=c] sE[1...AXES],sdelta[][] prin phi[][] "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" "***********************************************************************" CALC rptal=1+AXES IF .NOT.UNSET(ROWPARAMS) POIN [MODI=Y;NVAL=#rptal] ROWPARAMS
Lampiran
68 CALC ROWPARAMS[1...rptal]=sG[AXES],sgamma[AXES][1...AXES] ENDI IF .NOT.UNSET(COLPARAMS) POIN [MODI=Y;NVAL=#rptal] COLPARAMS CALC COLPARAMS[1...rptal]=sE[AXES],sdelta[AXES][1...AXES] ENDI "***********************************************************************" "***********************************************************************" IF efftal.gt.0 CALC pefftal=efftal+1 CALC dfver[0...pefftal]=df[0],df[0...mefftal],df[efftal] - \ 0 ,df[1... efftal], 0 CALC deviver[0...pefftal]=devi[0],devi[0...mefftal],devi[efftal] - \ 0 ,devi[1... efftal], 0 ENDI "***********************************************************************" "prin [ipri=*;squa=y] 'Print diagnostics',PRINT" IF 'DIAGNOST' .IN. PRINT IF NOBS(RESIDUALALS).GT.0 "exact model without residuals" GRAP LINEARPREDICT,WORKVARIATE; LINEARPREDICT; meth=l,p GRAP [NROW=21; NCOL=61] RESIDUALS;FITTEDVALUES; symb=ROW GRAP [NROW=21; NCOL=61] RESIDUALS;LINEARPRLUES; symb=ROW GRAP [NROW=21; NCOL=61] RESIDUALS;FITTEDVALUES; symb=COLUMN GRAP [NROW=21; NCOL=61] RESIDUALS;LINEARPREDICT; symb=COLUMN CALC res2=RESIDUALS**2 TABU [m=y; class=ROW,COLUMN] res2; tot=devres PRIN [IPRI=*;SQUA=Y] 'Total residual:',devres ENDI ENDI "***********************************************************************" IF AXES.GT.1 CALC cagamma[1...AXES],cadelta[1...AXES] = \ sqrt(normdelta[1...AXES],normdelta[1...AXES])*\ gamma[1...AXES],delta[1...AXES] CALC grgamma[1...AXES],grdelta[1...AXES] = \ normdelta[1...AXES],normdelta[1...AXES]*\ gamma[1...AXES],delta[1...AXES] IF NVAL(BIPLOT) DELE [rede=yes] BIPLOT[1...BIPLTAL] CALC BIPLOT[1...BIPLTAL]=cagamma[1...AXES],cadelta[1...AXES],\ grgamma[1...AXES],grdelta[1...AXES] \REST BIPLOT[] ENDI "prin [ipri=*;squa=y] 'Print biplots'" IF ('BIPLOTS' .IN. PRINT) TEXT [valu=' Row-Column biplot sigma scaled 0.5-0.5'] rcgt TEXT [val=' Column biplot sigma scaled 1'] cgt TEXT [val=' Row biplot sigma scaled 1'] rgt FOR i=1...axesmin CALC iplus=i+1 FOR j=iplus...AXES CALC imin,iplus,jmin,jplus=i,AXES,j,AXES-(1,i,1,j) CONC [bpas] 'AXES',#asnum,' vs.',#asnum;\ widt=*,(0)#jmin,2,(0)#jplus,*,(0)#imin,2,(0)#iplus CONC [rctit] bpas,rcgt CONC [rtit] bpas,rgt CONC [ctit] bpas,cgt GRAP [titl=rctit;eq=sc] cagamma[j],cadelta[j],0; \ cagamma[i],cadelta[i],0; symb=Grow,Gcolumn,'+' GRAP [titl=rtit; eq=sc] grgamma[j],0; \ grgamma[i],0; symb=Grow,'+' GRAP [titl=ctit; eq=sc] grdelta[j],0; \ grdelta[i],0; symb=Gcolumn,'+' ENDF ENDF
Lampiran
69 ENDI ENDI "***********************************************************************" "prin [ipri=*;squa=y] 'Print model'" IF 'MODEL' .IN. PRINT PAGE SKIP [FILE=outp] 2 PRIN [IPRI=*;SQUA=Y]\ '*** GenerAlized Main effects and Multiplicative ***' PRIN [IPRI=*;SQUA=Y]\ '*** Interaction model analysis ***' SKIP [FILE=outp] 1 TEXT [NVAL=1] tlink EQUA [OLDF=!((-1)#nlink,1)] OLDS=!t(x,#linkname); NEWS=tlink PRIN [IPRI=*; SQUA=yes] \ 'Response variate ',!p(Y); FIELD=25,*; JUST=r,l & 'Weight variate ',!p(WEIGHTS); FIELD=25,*; JUST=r,l & 'Distribution ',DISTRIBUTION; FIELD=25,*; JUST=r,l & 'Dispersion ',disp; FIELD=25,*; JUST=r,l & 'Link function ',tlink; FIELD=25,*; JUST=r,l & 'Number of ROWs ',notmisv,'FROM',nvars;\ FIELD=25,8,5,5; DECI=0; JUST=r,l,l,l & 'Number of COLUMNs ',notmise,'FROM',nenvs;\ FIELD=25,8,5,5; DEC=0; JUST=r,l,l,l & 'COL COVARIATES ',thch;FIEL=25,3;DECI=0;JUST=r,l & 'ROW COVARIATES ',thrh;FIEL=25,3;DECI=0;JUST=r,l & 'Number of multipl.axes',AXES;FIEL=25,3;JUST=r,l;DECI=0 & 'Convergence criterion',TOLERANCE;FIELD=25,12; DECI=6; JUST=r,l & 'Number of iterations ',tcycle; FIELD=25,8; DEC=0; JUST=r,l ENDI "***********************************************************************" "prin [ipri=*;squa=y] 'Print summary'" IF 'SUMMARY' .IN. PRINT IF DISTRIBUTION.EQS.'NORMAL' TEXT head[1...4],inttext;\ VALUES='variance','s.s.','m.s.','v.r.',!t(('Ammi__')#AXES) ELSE TEXT head[1...4],inttext; \ VALU='deviance','deviance','mean dev.','dev. ratio',\ !t(('gamma')#AXES) ENDI CONC inttext,asnum;skip=*,1;widt=6,3 CALC sourlen=nval(source)-1+AXES+3 CALC maintal=efftal-AXES "source - first element (=total) + AXES + RESIDUAL +empty +TOTAL" TEXT [VALU=(' ')#sourlen] source2 EQUA [OLDF=!(-1,maintal,AXES,3)] \ !t(#source,#inttext,'Residual',' ','Total ');source2 CALC dfver[0...pefftal]=MVIN(dfver[0...pefftal];dfver[0...pefftal].eq.0) CALC mdev[0...pefftal]=deviver[0...pefftal]/dfver[0...pefftal] VARI deviance,dimension,meandev;\ !(deviver[1...pefftal],*,deviver[0]),\ !( dfver[1...pefftal],*, dfver[0]),\ !( mdev[1...pefftal],*,mdev[0]) FOR i=1...AXES CALC asno=maintal+i+1 CALC asrest=pefftal-asno+1 CALC devr[i]=meandev/\ (vsum(!p(deviver[asno...pefftal]))/\ vsum(!p( dfver[asno...pefftal]))) "tests op as-niveau's" CALC devr[i]=mvin(devr[i];!((0)#maintal,(0)#i,(1)#asrest,0,1)) ENDF SKIP [FILE=outp] 2
Lampiran
70 PRIN [IPRI=*] '*** Analysis of',head[1],'***'; FIELD=1 & 'Source','d.f.',head[2...3],(head[4])#AXES;\ FIELD=15,8,12,12,(12)#AXES & [SQUASH=yes; MISSING=' '] \ source2,dimension,deviance,meandev,devr[1...AXES]; \ FIEL=15,8,12,12,(12)#AXES;DEC=*,0,4,4,(2)#AXES;JUST=l,(r)3,(r)#AXES SKIP [FILE=outp] 5 ENDI "***********************************************************************" DELE [REDE=Y] "As many as you lay hold of" DUMM WEIGHTS;VALU=* "***********************************************************************" ENDPROCEDURE "GAMMI" "***********************************************************************"
Lampiran 11. Contoh Perintah GENSTAT untuk GAMMI return [clos=yes] text [valu='Bem',. . . ,'Lon'] labnema text [valu='IAC-100',. . . ,'Wils'] labgeno calc nnema,ngeno=nval(labnema,labgeno) unit [nval=20] fact [lev=nnema;labe=labnema] nema fact [lev=ngeno;lab=labgeno] geno gene geno,nema variate a read a ... (data) ... : GAMMI [dist=normal;link=ident;main=both;maxc=30;prin=mo,sum,bipl,diag;\ axes=3;seed=183639]\ a;nbin=*;row=geno;colu=nema;\ fitt=fit;resi=residual; bipl=bip prin bip[1,2] prin bip[3,4] GAMMI [dist=poisson;link=log;main=both;maxc=30;prin=mo,sum,bipl,diag;\ axes=3;seed=183639]\ a;nbin=*;row=geno;colu=nema;\ cook=cook;fitt=fit;resi=residual;workv=z; linearp=nu; bipl=bip prin bip[1,2] prin bip[3,4]
Lampiran 12. Perintah GENSTAT untuk Procrustes ROTATE [PRINT=rotations,residuals,sums; SCALING=yes; STANDARDIZE=centre,normalize;\ SUPPRESS=no] XINPUT=MX; YINPUT=MXX
Lampiran