Rev 3821 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
SUBROUTINE INCLUD(NP, NRBAR, WEIGHT, XROW, YELEM, D,+ RBAR, THETAB, SSERR, IER)CC ALGORITHM AS274 APPL. STATIST. (1992) VOL.41, NO. 2C Modified from algorithm AS 75.1CC Calling this routine updates d, rbar, thetab and sserr by theC inclusion of xrow, yelem with the specified weight. The numberC of columns (variables) may exceed the number of rows (cases).CC**** WARNING: The elements of XROW are overwritten ****CINTEGER NP, NRBAR, IERDOUBLE PRECISION WEIGHT, XROW(NP), YELEM, D(NP), RBAR(*),+ THETAB(NP), SSERRCC Local variablesCINTEGER I, K, NEXTRDOUBLE PRECISION ZERO, W, Y, XI, DI, WXI, DPI, CBAR, SBAR, XKCDATA ZERO/0.D0/CC Some checks.CIER = 0IF (NP .LT. 1) IER = 1IF (NRBAR .LT. NP*(NP-1)/2) IER = IER + 2IF (IER .NE. 0) RETURNCW = WEIGHTY = YELEMNEXTR = 1DO 30 I = 1, NPCC Skip unnecessary transformations. Test on exact zeroes must beC used or stability can be destroyed.CIF (W .EQ. ZERO) RETURNXI = XROW(I)IF (XI .EQ. ZERO) THENNEXTR = NEXTR + NP - IGO TO 30END IFDI = D(I)WXI = W * XIDPI = DI + WXI*XICBAR = DI / DPISBAR = WXI / DPIW = CBAR * WD(I) = DPIIF (I .EQ. NP) GO TO 20DO 10 K = I+1, NPXK = XROW(K)XROW(K) = XK - XI * RBAR(NEXTR)RBAR(NEXTR) = CBAR * RBAR(NEXTR) + SBAR * XKNEXTR = NEXTR + 110 CONTINUE20 XK = YY = XK - XI * THETAB(I)THETAB(I) = CBAR * THETAB(I) + SBAR * XK30 CONTINUECC Y * SQRT(W) is now equal to Brown & Durbin's recursive residual.CSSERR = SSERR + W * Y * YCRETURNENDCCSUBROUTINE TOLSET(NP, NRBAR, D, RBAR, TOL, WORK, IER)CC ALGORITHM AS274 APPL. STATIST. (1992) VOL.41, NO. 2CC Sets up array TOL for testing for zeroes in an orthogonalC reduction formed using AS75.1.CINTEGER NP, NRBAR, IERDOUBLE PRECISION D(NP), RBAR(*), TOL(NP), WORK(NP)CC Local variables.CINTEGER COL, ROW, POSDOUBLE PRECISION EPS, SUM, ZEROCC EPS is a machine-dependent constant. For compilers which useC the IEEE format for floating-point numbers, recommended valuesC are 1.E-06 for single precision and 1.D-12 for double precision.Cc changed EPS from 10^-12 to 5x10^-10 to try to fix a bugDATA EPS/1.D-12/, ZERO/0.D0/CC Some checks.CIER = 0IF (NP .LT. 1) IER = 1IF (NRBAR .LT. NP*(NP-1)/2) IER = IER + 2IF (IER .NE. 0) RETURNCC Set TOL(I) = sum of absolute values in column I of RBAR afterC scaling each element by the square root of its row multiplier.CDO 10 ROW = 1, NP10 WORK(ROW) = SQRT(D(ROW))DO 30 COL = 1, NPPOS = COL - 1IF (COL .LE. NP) THENSUM = WORK(COL)ELSESUM = ZEROEND IFDO 20 ROW = 1, MIN(COL-1, NP)SUM = SUM + ABS(RBAR(POS)) * WORK(ROW)POS = POS + NP - ROW - 120 CONTINUETOL(COL) = EPS * SUM30 CONTINUECRETURNENDSUBROUTINE SINGCHK(NP, NRBAR, D, RBAR, THETAB, SSERR, TOL,+ LINDEP, WORK, IER)CC ALGORITHM AS274 APPL. STATIST. (1992) VOL.41, NO. 2CC Checks for singularities, reports, and adjusts orthogonalC reductions produced by AS75.1.CINTEGER NP, NRBAR, IERDOUBLE PRECISION D(NP), RBAR(NRBAR), THETAB(NP), SSERR,+ TOL(NP), WORK(NP)LOGICAL LINDEP(NP)CC Local variablesCDOUBLE PRECISION ZERO, TEMPINTEGER COL, POS, ROW, NC2, POS2CDATA ZERO/0.D0/CC Check input parametersCIER = 0IF (NP .LT. 1) IER = 1IF (NRBAR .LT. NP*(NP-1)/2) IER = IER + 2IF (IER .NE. 0) RETURNCDO 10 COL = 1, NP10 WORK(COL) = SQRT(D(COL))CDO 40 COL = 1, NPCC Set elements within RBAR to zero if they are less than TOL(COL) inC absolute value after being scaled by the square root of their rowC multiplier.CTEMP = TOL(COL)POS = COL - 1DO 30 ROW = 1, COL-1IF (ABS(RBAR(POS)) * WORK(ROW) .LT. TEMP) RBAR(POS) = ZEROPOS = POS + NP - ROW - 130 CONTINUECC If diagonal element is near zero, set it to zero, set appropriateC element of LINDEP, and use INCLUD to augment the projections inC the lower rows of the orthogonalization.CLINDEP(COL) = .FALSE.IF (WORK(COL) .LE. TEMP) THENLINDEP(COL) = .TRUE.IER = IER - 1IF (COL .LT. NP) THENNC2 = NP - COLPOS2 = POS + NP - COL + 1CALL INCLUD(NC2, NC2*(NC2-1)/2, D(COL), RBAR(POS+1),+ THETAB(COL), D(COL+1), RBAR(POS2), THETAB(COL+1),+ SSERR, IER)ELSESSERR = SSERR + D(COL) * THETAB(COL)**2END IFD(COL) = ZEROWORK(COL) = ZEROTHETAB(COL) = ZEROEND IF40 CONTINUERETURNENDSUBROUTINE REGCF(NP, NRBAR, D, RBAR, THETAB, TOL, BETA,+ NREQ, IER)CC ALGORITHM AS274 APPL. STATIST. (1992) VOL 41, NO. xCC Modified version of AS75.4 to calculate regression coefficientsC for the first NREQ variables, given an orthogonal reduction fromC AS75.1.CINTEGER NP, NRBAR, NREQ, IERDOUBLE PRECISION D(NP), RBAR(*), THETAB(NP), TOL(NP),+ BETA(NP)CC Local variablesCINTEGER I, J, NEXTRDOUBLE PRECISION ZEROCDATA ZERO/0.D0/CC Some checks.CIER = 0IF (NP .LT. 1) IER = 1IF (NRBAR .LT. NP*(NP-1)/2) IER = IER + 2IF (NREQ .LT. 1 .OR. NREQ .GT. NP) IER = IER + 4IF (IER .NE. 0) RETURNCDO 20 I = NREQ, 1, -1IF (SQRT(D(I)) .LT. TOL(I)) THENBETA(I) = ZEROD(I) = ZEROGO TO 20END IFBETA(I) = THETAB(I)NEXTR = (I-1) * (NP+NP-I)/2 + 1DO 10 J = I+1, NREQBETA(I) = BETA(I) - RBAR(NEXTR) * BETA(J)NEXTR = NEXTR + 110 CONTINUE20 CONTINUECRETURNEND