1
C===========================================================================
2
C Copyright (C) 1995-2005 European Southern Observatory (ESO)
4
C This program is free software; you can redistribute it and/or
5
C modify it under the terms of the GNU General Public License as
6
C published by the Free Software Foundation; either version 2 of
7
C the License, or (at your option) any later version.
9
C This program is distributed in the hope that it will be useful,
10
C but WITHOUT ANY WARRANTY; without even the implied warranty of
11
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
C GNU General Public License for more details.
14
C You should have received a copy of the GNU General Public
15
C License along with this program; if not, write to the Free
16
C Software Foundation, Inc., 675 Massachusetts Ave, Cambridge,
19
C Correspondence concerning ESO-MIDAS should be addressed as follows:
20
C Internet e-mail: midas@eso.org
21
C Postal address: European Southern Observatory
22
C Data Management Division
23
C Karl-Schwarzschild-Strasse 2
24
C D 85748 Garching bei Muenchen
26
C===========================================================================
29
CC *LSL* : CALCULATES THE (REWEIGHTED) LS WHEN 'NVAR' EQUALS 1
32
SUBROUTINE LSL(NCAS,NDXY,X,Y,RESDU,A,FCKW,H,NMXV,NDXX)
34
INCLUDE 'MID_REL_INCL:implicit.inc'
36
DOUBLE PRECISION H(NMXV,NDXX)
37
DIMENSION A(NMXV),X(NDXX,NDXY),Y(NDXY),RESDU(NDXY)
43
SXY=SXY+X(1,JNC)*Y(JNC)*RESDU(JNC)
44
SX2=SX2+(X(1,JNC)**2)*RESDU(JNC)
49
20 FCKW=FCKW+( (Y(JNC)-X(1,JNC)*A(1))**2 )*RESDU(JNC)
50
H(1,1)=DBLE((FCKW/(AL-1.0))/SX2)
54
CC *FCN* : PUTS A ROW OF THE MATRIX X IN A VECTOR.
56
SUBROUTINE FCN(K,M,F,X,JFLAG)
58
INCLUDE 'MID_REL_INCL:implicit.inc'
68
CC *LSREG* : CALCULATES THE LEAST SQUARES REGRESSION ESTIMATES.
70
SUBROUTINE LSREG(NDXX,NDXY,NMXV,K,N,M,F,X,Y,W,DA,
71
1 H,FCKW,HVEC,JDMB,JNDEX)
73
INCLUDE 'MID_REL_INCL:implicit.inc'
75
DIMENSION X(NDXX,NDXY),F(K),Y(N),W(N),H(NMXV,NDXX),DA(K)
76
DIMENSION HVEC(JDMB),JNDEX(NDXX)
77
DOUBLE PRECISION H,HVEC,DTEM,DFCKW,DFACT
78
DOUBLE PRECISION DWJNC,DYJ,DFKA
89
CALL FCN(K,M,F,X(1,JNC),JFLAG)
96
H(KA,K+1) = H(KA,K+1) + DWJNC*DFKA*DYJ
98
H(KA,L) = H(KA,L) + DWJNC*DFKA*DBLE(F(L))
107
CALL MATNV(H,NMXV,NDXX,HVEC,JDMB,K,1,NERR,DTEM,JNDEX)
109
FCKW = QLSRG(K,N,M,NDXX,NDXY,NMXV,F,X,Y,W,DA,H,MM)
119
H(JNC,J)=H(JNC,J)*DFACT
129
CC *QLSRG* : EVALUATES THE OBJECTIVE FUNCTION FOR LS REGRESSION.
131
FUNCTION QLSRG(K,N,M,NDXX,NDXY,NMXV,F,X,Y,W,DA,H,MM)
133
INCLUDE 'MID_REL_INCL:implicit.inc'
135
DIMENSION F(K),X(NDXX,NDXY),DA(K),H(NMXV,NDXX),Y(N),W(N)
136
DOUBLE PRECISION H,Q,HSUM
141
CALL FCN(K,M,F,X(1,JNC),JFLAG)
144
20 HSUM=H(JNCB,MM)*F(JNCB)+HSUM
145
30 Q=(HSUM-Y(JNC))*(HSUM-Y(JNC))*W(JNC)+Q
150
CC *MATNV* : PERFORMS A MATRIX INVERSION.
152
SUBROUTINE MATNV(AM,NMXV,NDXX,HVEC,JDMB,NA,NB,NERR,DTEM,JNDEX)
154
INCLUDE 'MID_REL_INCL:implicit.inc'
156
DOUBLE PRECISION AM,HVEC,DTEM,DETER,TURN,SWAP
157
DIMENSION HVEC(JDMB),JNDEX(NDXX),AM(NMXV,NDXX)
178
IF(DABS(HVEC(JNCB))-DABS(TURN)) 40,40,30
183
50 JPAAL=LDEL-JDELC+1
185
IF(JPAAL-JHFD) 80,80,60
193
HVEC(JNCD)=HVEC(JPAAL)
199
90 HVEC(JNC)=-HVEC(JNC)*TURN
206
IF(JNC-JHFD) 100,120,100
210
DO 110 JNCC=JPAAL,JCL
212
110 HVEC(JNCC)=HVEC(JNCC)+SWAP*HVEC(JNCD)
219
IF(LDEL-JHFD) 140,160,140
220
140 JPAAL=(LDEL-1)*JDM+1
222
JDELC=(JHFD-1)*JDM+1-JPAAL
223
DO 150 JNCC=JPAAL,JCL
226
HVEC(JNCC)=HVEC(JNCD)
243
CC *LCAT* : CALCULATES LOCATION ESTIMATES.
245
SUBROUTINE LCAT(NCAS,NVAR,JCST,JPRT,NVAD,X,Y,RESDU,WEIGHTS,PREC,
246
1 XMED,XMAD,NZWE,AVW,JPLT,AW,NMVAL,NDXX,NDXY,MVAL,LUA,LUB,LUC,
247
1 JREG,JHEAD,FNAMEA,FNAMEB,FNAMEC,YNSAVE,LAB,JFMT,JVARS,YN,JPLACE)
249
INCLUDE 'MID_REL_INCL:implicit.inc'
251
DIMENSION A(11),X(NDXX,NDXY),Y(NDXY),RESDU(NDXY),WEIGHTS(NDXY)
252
DIMENSION XMED(NDXX),XMAD(NDXX),AW(NDXY),NMVAL(NDXY),JPLACE(NDXX)
254
CHARACTER*10 LAB(NDXX)
255
CHARACTER*30 FNAMEA,FNAMEB,FNAMEC
256
CHARACTER*60 JFMT,JHEAD
262
10 WRITE(LUB,8000) NCAS
263
WRITE(LUB,8010) JHEAD
266
ELSEIF (JPRT.EQ.1) THEN
268
ELSEIF (JPRT.EQ.2) THEN
271
IF (JPLT.NE.0) WRITE(LUB,8050)
275
WRITE(CBUF,8070) NCAS
276
CALL STTPUT(CBUF,ISTAT)
279
IF (FNAMEA.EQ.'CON') THEN
281
CALL STTPUT(CBUF,ISTAT)
285
IF (FNAMEA.EQ.'CON'.AND.JNC.EQ.1) THEN
287
CALL STTPUT(CBUF,ISTAT)
289
IF (FNAMEA.EQ.'CON'.AND.JNC.NE.1) THEN
291
CALL STTPUT(CBUF,ISTAT)
293
IF (YN.NE.'Y') GOTO 30
294
C READ(LUA,*) (AW(J),J=1,JVARS)
297
CALL TBERDR(LUA,JNC,JH,AW(JH),NULL,STATUS)
298
CALL STTPUT('Module PRE.F/LCAT: Beware the selection flag',
302
IF (YNSAVE.EQ.'Y') WRITE(LUC,*) Y(JNC)
304
30 READ(LUA,JFMT) (AW(J),J=1,JVARS)
307
IF (YNSAVE.EQ.'Y') WRITE(LUC,JFMT) Y(JNC)
309
IF (YNSAVE.EQ.'Y') CLOSE(LUC,STATUS='KEEP')
310
IF (MVAL.NE.0) CALL SMISLOC(NCAS,NDXX,NDXY,X,Y,NMVAL,NSTOP)
312
WRITE(CBUF,8070) NCAS
313
CALL STTPUT(CBUF,ISTAT)
319
JQU=INT(AL/2.0)+INT((ANVAR+1.0)/2.0)
320
IF (JPRT.EQ.0) GOTO 60
323
50 WRITE(LUB,8110) JNC,Y(JNC)
324
60 XMED(1)=AMDAN(AW,NDXY,Y,NCAS)
326
RESDU(JNC)=ABS(Y(JNC)-XMED(1))
328
XMAD(1)=AMDAN(AW,NDXY,RESDU,NCAS)
329
XMAD(2)=XMAD(1)*1.4826
330
WRITE(LUB,8120) XMED(1),XMAD(2)
331
IF (ABS(XMAD(1)).LE.1.0E-12) THEN
338
80 A(2)=A(2)+(Y(JNC)-A(1))**2
339
A(2)=SQRT(A(2)/(AL-1.0))
340
WRITE(LUB,8140) A(1),A(2)
342
CALL RDUAL(A,0,NVAD,NCAS,NVAR,JCST,JPRT,NVAD,LUB,PREC,JREG,
343
1 X,Y,RESDU,WEIGHTS,XMED,XMAD,NZWE,AVW,JPLT,AW,NMVAL,
344
1 NDXX,NDXY,JHEAD,LAB)
347
CALL SHHLF(Y,NCAS,JQU,SLUTN,BSTD,PREC)
348
BSTD=BSTD*1.4826*(5.0/(AL-ANVAR)+1.0)
349
WRITE(LUB,8150) SLUTN,BSTD
352
CC-----DETERMINATION OF THE WEIGHTS
356
RESDU(JNC)=(Y(JNC)-A(1))/A(2)
357
IF (ABS(RESDU(JNC)).LT.2.5) THEN
363
write(CBUF,*) jnc,y(jnc),resdu(jnc),nzwe,weights(jnc)
364
CALL STTPUT(CBUF,ISTAT)
369
CALL RDUAL(A,1,NVAD,NCAS,NVAR,JCST,JPRT,NVAD,LUB,PREC,JREG,
370
1 X,Y,RESDU,WEIGHTS,XMED,XMAD,NZWE,AVW,JPLT,AW,NMVAL,
371
1 NDXX,NDXY,JHEAD,LAB)
375
WRITE(CBUF,8170) NZWE
376
CALL STTPUT(CBUF,ISTAT)
382
110 A(1)=A(1)+Y(JNC)*WEIGHTS(JNC)
385
120 A(2)=A(2)+((Y(JNC)-A(1))**2)*WEIGHTS(JNC)
386
A(2)=SQRT(A(2)/(AL-1.0))
387
WRITE(LUB,8180) A(1),A(2)
391
CALL RDUAL(A,2,NVAD,NCAS,NVAR,JCST,JPRT,NVAD,LUB,PREC,JREG,
392
1 X,Y,RESDU,WEIGHTS,XMED,XMAD,NZWE,AVW,JPLT,AW,NMVAL,
393
1 NDXX,NDXY,JHEAD,LAB)
396
CALL STTPUT(CBUF,ISTAT)
397
IF (YNSAVE.EQ.'Y') THEN
398
WRITE(CBUF,8220) FNAMEC
399
CALL STTPUT(CBUF,ISTAT)
401
IF (FNAMEA.NE.'CON') THEN
402
WRITE(CBUF,8230) FNAMEA
403
CALL STTPUT(CBUF,ISTAT)
405
IF (FNAMEB.NE.'CON'.AND.FNAMEB.NE.'PRN') THEN
406
WRITE(CBUF,8240) FNAMEB
407
CALL STTPUT(CBUF,ISTAT)
410
8000 FORMAT(1X,34('*')/' * ROBUST ESTIMATION OF LOCATION. *'/
411
1 1X,34('*')///' NUMBER OF CASES = ',I5//)
412
8010 FORMAT(' DATA SET = ',A60/)
413
8020 FORMAT(/' THE DESIRED OUTPUT IS SMALL.'/)
414
8030 FORMAT(/' THE DESIRED OUTPUT IS MEDIUM-SIZED.'/)
415
8040 FORMAT(/' THE DESIRED OUTPUT IS LARGE.'/)
416
8050 FORMAT(/' AN INDEX PLOT WILL BE DRAWN.'/)
417
8070 FORMAT(/' THERE ARE ONLY ',I4,' CASES. THE ANALYSIS MUST',
419
8060 FORMAT(//' PLEASE ENTER YOUR DATA.'/)
420
8080 FORMAT(1X,' THE DATA FOR CASE NUMBER ',I4,' : ',$)
421
8090 FORMAT(' THE DATA FOR CASE NUMBER ',I4,' : ',$)
422
8100 FORMAT(' THE OBSERVATIONS ARE:'/)
423
8110 FORMAT(I5,2X,F10.4)
424
8120 FORMAT(//' THE MEDIAN',12X,'= ',F11.4,2X,
425
1 ' THE MAD (X 1.4826)',4X,'= ',F11.4/)
426
8125 FORMAT(/' MORE THAN HALF OF THE DATA ARE EQUAL.'//)
427
8130 FORMAT(/1X,78('*')/)
428
8140 FORMAT(//' THE MEAN',14X,'= ',F11.4,2X,
429
1 ' STANDARD DEVIATION',4X,'= ',F11.4//)
430
8150 FORMAT(//' LMS',19X,'= ',F11.4,3X,
431
1 'CORRESPONDING SCALE',3X,'= ',F11.4//)
432
8160 FORMAT(/' REWEIGHTING USING THE WEIGHTS BASED ON THE LMS.'/
434
8170 FORMAT(/' THERE ARE ONLY ',I4,' CASES WITH NON-ZERO WEIGHT.'/
435
1 ' THE ANALYSIS MUST BE STOPPED.'/)
436
8180 FORMAT(//' WEIGHTED MEAN',9X,'= ',F11.4,2X,
437
1 ' WEIGHTED STAND. DEV. = ',F11.4//)
438
8190 FORMAT(/' THERE ARE',2X,I4,' POINTS WITH NON-ZERO WEIGHT. ')
439
8200 FORMAT(/' AVERAGE WEIGHT',13X,'= ',F20.6//)
440
8210 FORMAT(////' THE RUN HAS SUCCESSFULLY BEEN EXECUTED . '//)
441
8220 FORMAT(' THE DATA IS SAVED IN FILE : ',A30)
442
8230 FORMAT(' THE DATA HAS BEEN READ FROM FILE : ',A30)
443
8240 FORMAT(' THE OUTPUT HAS BEEN WRITTEN IN FILE : ',A30)
447
CC *SMISLOC* : handling of missing values in the case of location
449
SUBROUTINE SMISLOC(NCAS,NDXX,NDXY,X,Y,NMVAL,NSTOP)
451
INCLUDE 'MID_REL_INCL:implicit.inc'
453
DIMENSION X(NDXX,NDXY),Y(NDXY),NMVAL(NDXY)
460
CC-----GIVE THE MISSING VALUE CODE
462
CALL STTPUT(CBUF,ISTAT)
463
5 READ(*,*,ERR=50)CODE
465
IF (Y(JNC).EQ.CODE) THEN
474
WRITE(CBUF,8010) NCAS
475
CALL STTPUT(CBUF,ISTAT)
476
IF (JND.GT.MAXM) THEN
477
CALL STTPUT('More than 80 percent of the cases had to
478
1 be deleted because of the missing values.',ISTAT)
479
CALL STTPUT('The analysis will be stopped.',ISTAT)
487
50 CALL STETER('Error reading input!')
490
8000 FORMAT(/' Please enter the value of this variable which'/
491
1 ' has to be interpreted as the missing value code : ',$)
492
8010 FORMAT(/' There are ',I4,' cases staying in the analysis.'/)