' tabulazione sperimentale di CHI^2 DECLARE SUB ordfus (x!(), i!, j!) DECLARE SUB PERCENTILI (P!(), P!, a!(), N!, pl!()) DECLARE SUB fusione (x!(), i!, h!, y!(), j!, K!, z!()) REM densita' chi-2 REM nc=n. classi ,a%(i)=frequenza classe i-esima ,tot=n totale di prove PRINT PRINT "-------------------" PRINT " Il programma studia sperimentalmente il CHI^2 teorico di una distribuzione" PRINT "uniforme discreta relativo a N PROVE:" PRINT "stampa il valore K del P-esimo percentile in corrispondenza di diversi valori" PRINT "di P (cioe' K delimita il primo P% dei valori ordinati ottenuti sperimental-" PRINT "te; ossia: FreqRel(chi^2 < K) <= P% e FreqRel(chi^2 > K) <= (100-P)% )" PRINT " All'aumentare di N si ottengono approssimazioni man mano migliori dei per-" PRINT "centili del CHI^2 limite, che non dipende dalla legge di distribuzione." PRINT " Il confronto con i percentili ti permette di valutare la normalita` del" PRINT "valore chi^2 che ottieni realizzando uno specifico test." PRINT PRINT " Per una stima accettabile dei percentili teorici, possono bastare 500" PRINT "esperimenti." PRINT " Per una stima riferita al chi^2 limite (N infinito), o a un numero di PROVE" PRINT "molto grande, puo` bastare N=200 (per stimare percentili con valori molto" PRINT "minori di 0 puo` essere necessario aumentare N)." PRINT PRINT "Per arrestare il programma introduci un grado di liberta' negativo." 10 PRINT RANDOMIZE TIMER INPUT ; "n. GRADI di liberta`"; g.l IF g.l = 0 THEN GOTO 10 IF g.l < 1 THEN CLOSE #1: END n.ev = g.l + 1: p.teor = 1 / n.ev: DIM f%(n.ev) INPUT ; " n. PROVE"; N INPUT " n. esperimenti"; tot Np = N / n.ev: ' Np = N * prob. teorica DIM c(tot) 'uscite degli esperimenti FOR i% = 1 TO tot FOR j% = 1 TO N u% = INT(RND * n.ev) + 1: f%(u%) = f%(u%) + 1 NEXT chi2 = 0 FOR u% = 1 TO n.ev chi2 = chi2 + (f%(u%) - Np) * (f%(u%) - Np) / Np: f%(u%) = 0 NEXT c(i%) = chi2 NEXT ordfus c(), 1!, tot P = 11: DIM P(P), pl(P + 1) P(1) = .025: P(2) = .05: P(3) = .1: P(4) = .2: P(5) = .3: P(6) = .5: P(7) = .7: P(8) = .8: P(9) = .9: P(10) = .95: P(11) = .975 PERCENTILI P(), P, c(), tot, pl() ERASE f%, pl, c, P GOTO 10 SUB fusione (x(), i, h, y(), j, K, z()) STATIC ' fusione di x(i)-x(h) e y(j)-y(k) in z(0),z(1),. N% = 0: s% = i: t% = j WHILE s% <= h AND t% <= K IF x(s%) < y(t%) THEN z(N%) = x(s%): s% = s% + 1 ELSE z(N%) = y(t%): t% = t% + 1 N% = N% + 1: WEND FOR P% = s% TO h: z(N%) = x(P%): N% = N% + 1: NEXT P% FOR P% = t% TO K: z(N%) = y(P%): N% = N% + 1: NEXT P% END SUB SUB ordfus (x(), i, j) STATIC ' ordinamento per fusioni successive di x(i)-x(j), max 10000 dati IF usata = 0 THEN usata = 1: DIM i%(12), j%(12), y(10000) r% = 0: GOSUB ordfus1: EXIT SUB ordfus1: IF i = j THEN RETURN ELSE r% = r% + 1 j%(r%) = j: j = (i + j) \ 2: GOSUB ordfus1 i%(r%) = i: i = j + 1: j = j%(r%): GOSUB ordfus1 h = i: i = i%(r%) fusione x(), i, h - 1, x(), h, j, y() FOR N% = i TO j: x(N%) = y(N% - i): NEXT N% r% = r% - 1: RETURN END SUB SUB PERCENTILI (P(), P, a(), N, pl()) STATIC: ' a() gi… ordinato FOR i% = 1 TO P K = INT(N * P(i%)): k1 = K + 1 IF N * P(i%) = K THEN pl(i%) = a(K) ELSE pl(i%) = (a(K) + a(k1)) / 2 NEXT i% PRINT "Fr(chi2