Gambas: Statistik
Zurück zu Gambas
Beschreibende Statistik
[Bearbeiten]Mittelwert
[Bearbeiten]Das arithmetische Mittel (auch Durchschnitt) ist der am häufigsten benutzte Mittelwert und wird deshalb auch als Standardmittelwert bezeichnet.
Den arithmetischen Mittelwert einer Zahlenreihe können Sie berechnen , wenn Sie alle Elemente der Reihe zusammenzählen und die erhaltene Summe durch die Zahl der Elemente teilen.
Mittelwert = Summe der Werte / Anzahl der Werte
Beispiel für das arithmetische Mittel von 3,4 und 5:
Mittelwert = (3 + 4 + 5) / 3 = 4
Im folgenden Programmbeispiel wird dies umgesetzt.
Holen Sie sich aus der Werkzeugkiste eine Textarea , eine Textbox und einen Commandbutton. Diese ordnen Sie wie unten auf der Form an: Die Zahlen sind nur als Beispiel gedacht.
Textarea1 ******************** * 5 * * 5 * * 4 * * 5 * * * * * ******************** Befehlsbutton1: ************ *Mittelwert* ************ Textbox1 ******************** *4.75 * ********************
Der Code hinter dem Commandbutton Mittelwert schaut so aus und erinnert stark an ADDY, den Summierer:
PUBLIC SUB Button1_Click() DIM text AS String DIM summe AS Float DIM mw AS Float DIM Elt AS String[] DIM Sb AS String text = textarea1.Text Elt = Split(text,Chr(10)) FOR EACH Sb IN Elt summe = summe + Val(sb) NEXT mw = summe / elt.Length textbox1.Text = mw END
Das Programm nutzt als wesentliche Tricks einen Stringarray, den Befehl Split und das Zeichen CHR(10) um die einzelnen Zahlenglieder zu trennen.
Varianz und Standardabweichung
[Bearbeiten]Das Programm zur Berechnung des Mittelwertes kann man erweitern, so daß auch die Varianz und die Standardabweichung errechnet werden. Ein Testdatensatz ist auch dabei.
Bei der Gaußschen Normalverteilung ergibt sich, dass die Wahrscheinlichkeit etwa 2/3 dafür beträgt, dass die Messwerte innerhalb von +/– einer Standardabweichung vom Erwartungswert liegen und damit jeweils etwa 1/6 dafür, dass sie unterhalb bzw. oberhalb dieses Intervalls liegt.
Sie brauchen 3 Commandbuttons , eine Textarea und 2 Textboxen um es in Gang zu bringen.
Der Code schaut so aus:
PUBLIC SUB Button1_Click() DIM text AS String DIM summe AS Float DIM mw AS Float DIM varianz AS Float DIM sigma AS Float DIM Liste AS String[] DIM Einzelwert AS String text = textarea1.Text Liste = Split(text,Chr(10)) FOR EACH Einzelwert IN Liste summe = summe + Val(Einzelwert) NEXT mw = summe / Liste.Length textbox1.Text = mw varianz = 0 FOR EACH Einzelwert IN Liste varianz = varianz + ((Val(Einzelwert) - mw)^2) 'PRINT Einzelwert,mw,((Val(Einzelwert) - mw)^2) 'PRINT varianz NEXT varianz = varianz / (Liste.Length - 1) 'PRINT varianz sigma = Sqr(varianz) textbox2.Text = sigma END -------------------------- PUBLIC SUB Button2_Click() 'Testdatensatz in die Textarea füllen. textarea1.Text = "114,3" textarea1.Text = textarea1.Text & Chr(10) & "135,7" textarea1.Text = textarea1.Text & Chr(10) & "104,8" textarea1.Text = textarea1.Text & Chr(10) & "118,5" textarea1.Text = textarea1.Text & Chr(10) & "125,7" textarea1.Text = textarea1.Text & Chr(10) & "121,4" textarea1.Text = textarea1.Text & Chr(10) & "122,4" textarea1.Text = textarea1.Text & Chr(10) & "96,8" textarea1.Text = textarea1.Text & Chr(10) & "118,9" textarea1.Text = textarea1.Text & Chr(10) & "120" textarea1.Text = textarea1.Text & Chr(10) & "112,2" textarea1.Text = textarea1.Text & Chr(10) & "127,9" textarea1.Text = textarea1.Text & Chr(10) & "122,8" textarea1.Text = textarea1.Text & Chr(10) & "128,9" textarea1.Text = textarea1.Text & Chr(10) & "120,3" 'mw = 119,373 'varianz = 92,6016 'sigma = 9,62297 END ---------------------------- PUBLIC SUB Button3_Click() ME.Close END
Einem Profiprogrammierer dreht es den Magen um, wenn er sieht, wie der Testdatensatz geladen wird. Aber es funktioniert. Und als kleine programmiertechnische Herausforderung kann man das Laden des Testdatensatzes mit dem Array Befehl deutlich verkürzen.
Siehe Gambas: Arrays
Der Median
[Bearbeiten]Der Medianwert oder Zentralwert einer Werteliste liegt zwischen zwei gleich großen Hälften der Liste. 50 % der Werte sind größer/gleich als der Median, 50 % sind kleiner/gleich als der Median. Im Gegensatz zum arithmetischen Mittelwert ist er durch Extremwerte (Ausreißer) in der Werteliste kaum beeinflußbar.
Will man den Median programmieren muß man:
- 1.Die Werteliste sortieren
- 2.Überprüfen ob es sich um eine gerade Anzahl oder eine ungerade Anzahl von Werten handelt.
- 3.Die entsprechenden Formeln anwenden, um den Median zu berechnen.
- Bei ungerader Zahl an Werten
xmedian = x[(n+1)/2]
- Bei gerader Zahl an Werten
xmedian = 1/2*(x[n/2] + x[n/2+1])
Beispiel 1:
sortierte Werteliste:
11 12 13 14 15
Die Zahl der Werte ist ungerade , n = 5
(n+1)/2 = 6/2 = 3
xmedian = x[3] = 13
Beispiel 2.
sortierte Werteliste:
11 12 13 14 15 16
Die Zahl der Werte ist gerade , n = 6
n/2 = 6/2 = 3 x[3] = 13 x[4] = 14 xmedian = 1/2*(13+14) = 13,5
Sie können obige Werteliste direkt in Ihr Beispielprogramm übernehmen: Nutzen Sie dazu den Zwischenspeicher: Markieren, Strg+C drücken. In Ihrem Programm mit Strg+V wieder abladen. Sortieren und Median ausrechnen. Klappt es ?
Beispielprogramm: Sie brauchen 2 Textareas , 3 Commandbuttons und eine Textbox, um das Programm zu starten:
' Gambas CLASS file liste AS String[] PUBLIC SUB Form_Open() ME.Text = "Zentralwert berechnen" END PUBLIC SUB Button1_Click() 'umsortieren c AS Integer j AS Integer n AS Integer y AS Variant liste AS String[] element AS String txt AS String text AS String text = Textarea1.Text liste = Split(text,Chr(10)) y = 0 n = liste.length REPEAT c = 0 FOR j = 0 TO n - 2 'PRINT j,y,liste[0],ar[1],ar[2],ar[3],ar[4] IF Val(liste[j]) > Val(liste[j + 1]) THEN y = Val(liste[j]) liste[j] = liste[j + 1] liste[j + 1] = Str(y) c = 1 ENDIF NEXT UNTIL c = 0 FOR EACH element IN liste txt = txt & Str(element) & Chr(10) NEXT PRINT txt textarea2.Text = "" txt = Mid$(txt,1,-1) 'Der letzte Zeilenumbruch chr(10) muß weg textarea2.Text = txt END PUBLIC SUB Button2_Click() 'median berechnen, vorher umsortieren notwendig !! text AS String median AS Float liste AS String[] posten AS String text = Textarea2.Text liste = Split(text,Chr(10)) 'Länge bestimmen und richtige Formel verwenden, 'je nachdem ob die Länge gerade oder ungerade ist. IF liste.Length MOD 2 THEN 'PRINT liste.Length MOD 2 & " Ungerade" 'PRINT (liste.length + 1)/2 'PRINT liste[(liste.length + 1)/2 - 1] median = Val(liste[(liste.length + 1)/2 - 1]) 'Der Array beginnt mit dem Element 0 nicht mit 1 ! ELSE 'PRINT liste.Length MOD 2 & " Gerade" median = (Val(liste[liste.length/2 - 1]) + Val(liste[liste.length/2]))/2 'Der Array beginnt mit dem Element 0 nicht mit 1 ! ENDIF textbox1.Text = Str(median) END PUBLIC SUB Button3_Click() 'Ungerade Werteliste als Beispiel textarea1.Text = "114,3" textarea1.Text = textarea1.Text & Chr(10) & "135,7" textarea1.Text = textarea1.Text & Chr(10) & "104,8" textarea1.Text = textarea1.Text & Chr(10) & "118,5" textarea1.Text = textarea1.Text & Chr(10) & "125,7" textarea1.Text = textarea1.Text & Chr(10) & "121,4" textarea1.Text = textarea1.Text & Chr(10) & "122,4" textarea1.Text = textarea1.Text & Chr(10) & "96,8" textarea1.Text = textarea1.Text & Chr(10) & "118,9" textarea1.Text = textarea1.Text & Chr(10) & "120" textarea1.Text = textarea1.Text & Chr(10) & "112,2" textarea1.Text = textarea1.Text & Chr(10) & "127,9" textarea1.Text = textarea1.Text & Chr(10) & "122,8" textarea1.Text = textarea1.Text & Chr(10) & "128,9" textarea1.Text = textarea1.Text & Chr(10) & "120,3" 'median = 120,3 END
Gausssche Normalverteilung
[Bearbeiten]Das folgende Programm berechnet die Werte der Gaussschen Normalverteilung zwischen -5 und 5. Siehe auch: http://www.madeasy.de/2/gauss.htm
PUBLIC SUB Form_Open() DIM x AS Float DIM y AS Float DIM t AS String FOR x = -5 TO 5 STEP 0.1 y = 2.718 ^ (-x * x) t = t & Str(x) & " " & Str(y) & Chr(13) & Chr(10) NEXT PRINT t END
Tests
[Bearbeiten]Vierfeldertest
[Bearbeiten]Der Vierfeldertest ist einfaches, aber sehr wichtiges Werkzeug zur statistischen Bewertung von Merkmalen in 2 Gruppen.
Zur Ausführung des Programmes brauchen Sie:
- 4 Labelfelder
- 4 Textboxen
- 1 Textarea
- 3 Commandbuttons.
Der Code lautet:
PUBLIC SUB Form_Open() ME.Text = "Vierfeldertest" END PUBLIC SUB Button1_Click() ME.Close END PUBLIC SUB Button2_Click() textbox1.Text = "" textbox2.Text = "" textbox3.Text = "" textbox4.Text = "" textarea1.Text = "" END PUBLIC SUB Button3_Click() ' Rem Fehlerroutine bei leeren Feldern einbauen DIM N1 AS Float DIM N2 AS Float DIM M1 AS Float DIM M2 AS Float DIM R1 AS Float DIM NN AS Float DIM N AS Float DIM E1 AS Float DIM MM AS Float DIM E2 AS Float DIM R2 AS Float DIM E3 AS Float DIM E4 AS Float DIM D1 AS Float DIM C1 AS Float DIM D2 AS Float DIM C2 AS Float DIM D3 AS Float DIM C3 AS Float DIM D4 AS Float DIM C4 AS Float DIM C AS Float DIM S AS Float DIM P AS Float textarea1.Text = "" N1 = Val(textbox1.Text) N2 = Val(textbox2.Text) M1 = Val(textbox3.Text) M2 = Val(textbox4.Text) 'ERWARTUNGSWERT EN1 R1 = N1 + M1 NN = N1 + N2 N = N1 + N2 + M1 + M2 E1 = R1 * NN / N textarea1.Text = textarea1.Text & "Erwartungswert E1 =" & Str(E1) & Chr(13) & Chr(10) 'Rem ERWARTUNGSWERT EN2 MM = M1 + M2 E2 = R1 * MM / N textarea1.Text = textarea1.Text & "Erwartungswert E2 =" & Str(E2) & Chr(10) & Chr(13) 'Rem ERWARTUNGSWERT EN3 R2 = N2 + M2 E3 = R2 * NN / N textarea1.Text = textarea1.Text & "Erwartungswert E3 =" & Str(E3) & Chr(13) & Chr(10) 'Rem ERWARTUNGSWERT EN4 E4 = R2 * MM / N textarea1.Text = textarea1.Text & "Erwartungswert E4 =" & Str(E4) & Chr(13) & Chr(10) ' Rem PROBE=0? S = E1 + E2 + E3 + E4 P = S - N textarea1.Text = textarea1.Text & "Probe" & Str(S) & "-" & Str(N) & "=" & Str(P) & "=0?" & Chr(13) & Chr(10) ' Rem CHI^2 D1 = (N1 - E1) ^ 2 C1 = D1 / E1 D2 = (M1 - E2) ^ 2 C2 = D2 / E2 D3 = (N2 - E3) ^ 2 C3 = D3 / E3 D4 = (M2 - E4) ^ 2 C4 = D4 / E4 C = C1 + C2 + C3 + C4 textarea1.Text = textarea1.Text & "CHI-QUADRAT=" & Str(C) & Chr(13) & Chr(10) IF C - 3.841 > 0 THEN textarea1.Text = textarea1.Text & "Bei P=0.05 besteht ein signifikanter Unterschied" IF C - 3.841 <= 0 THEN textarea1.Text = textarea1.Text & "Bei P=0.05 besteht kein signifikanter Unterschied " END
Runtest
[Bearbeiten]Wenn man eine Messung aus Sicherheitsgründen mehrfach durchführt, kann man mit dem Runtest überprüfen, ob die erhaltenen einzelnen Messwerte rein zufällig um den wahren Wert streuen oder ob die Messung nichtzufällige Werte liefert. Allgemein kann man mit dem Runtest auch gut Zufallsgeneratoren wie z.B. einen Würfel oder eine Münze durch mehrfache Wiederholung auf ihre wirkliche Zufälligkeit überprüfen.
Siehe dazu auch: http://de.wikipedia.org/wiki/Run-Test
Überprüfung einer Münze auf Zufälligkeit
[Bearbeiten]Durch mehrfachen Münzwurf wurde folgende Ergebnisreihe gewonnen.
0100100101110111010001001101100101101
Dabei steht die 0 für Wappen und 1 für Zahl der Münze.
Ein Run ist dann eine Folge von Würfen mit demselben Ergebnis.
Folgende Runs sind in der Folge
0 1 00 1 00 1 0 111 0 1 000 1 00 11 0 11 00 1 0 11 0 1
Insgesamt sind es 24 Runs, d.h. Folgen mit demselben Zeichen 0 oder 1.
Wie kann man diese Serie jetzt auf Ihre Zufälligkeit überprüfen ?
Dazu braucht man einige Formeln und Parameter für den Runtest.
- Man braucht die Gesamtzahl der Würfe n.
- Man braucht die Gesamtzahl der Runs R.
- Man braucht die Zahl der 1er Würfe n1.
- Man braucht die Zahl der 0er Würfe n2.
- Man braucht den Erwartungswert ER für die statistisch erwartete Zahl der Runs.
ER = 2 * n1 * n2 / n + 1
- Man braucht die Varianz varR und die Wurzel der Varianz.
varR = 2*n1*n2*(2*n1*n2-n)/(n*n*(n1+n2-1)
- Man braucht ein Signifikanzniveau p = 0,05
- Man braucht eine Prüfgröße z. Diese muß zwischen -1,96 und +1,96 liegen , dann kann man von einer zufälligen Folge ausgehen.
z = (R - ER) / sqrt(varR)
Wie kann man das alles Programmieren ?
[Bearbeiten]Beispiel: Sie brauchen
- 4 Textareas,
- 13 Befehlsbuttons
- 10 Textboxen
auf Ihrer Form, um das Programm in Gang zu bringen.
Die Bedienung des Programmes ist gewöhnungsbedürftig. Sie verläuft so ziemlich im Uhrzeigersinn. Man kann die Bedienerführung verbessern, wenn man ein paar Errorroutinen mit CATCH einbaut und auf die richtige Bedienung hinweist. Außerdem ist der SETFOCUS Befehl hilfreich, der den nächsten Befehlsknopf markiert, den man drücken muß. Mit ein paar vernünftigen Unterprogrammen und einem Start des Programmes mit einem Knopfdruck wird alles einfacher und weniger fehlerträchtig. Das kommt dann in die verbesserte Version 2.
Layout
[Bearbeiten]Der Code
[Bearbeiten]PUBLIC SUB Form_Open() ME.Text = "Runtest durchführen" 'Der Run-Test ist ein nichtparametrischer Test 'auf Stationarität bzw. Nicht-Korrelation 'IN einer Zeitreihe oder anderen Sequenz. 'Die abzulehnende Nullhypothese ist hier, 'dass aufeinanderfolgende Werte unkorreliert sind. 'Ein run oder "Lauf" ist definiert als eine Folge 'von gleichen Symbolen IN einer Symbolsequenz 'mit endlichem Alphabet. 'Aus einer Symbolsequenz muss zunächst eine numerische Reihe 'erzeugt werden 'Zunächst wird der Median der Reihe berechnet 'und von allen Werten abgezogen. 'IN der resultierenden Reihe werden negative Zahlen 'durch ein '-' und positive durch ein '+' ersetzt. 'Für Stichprobenumfänge n1,n2 > 10 ist '(mit n1,n2 gleich der Anzahl der "plus" und der "minus") 'die Wahrscheinlichkeitsverteilung der runs ungefähr normal 'mit dem Mittelwert UM = 2 * n1*n2 /(n1+n2) + 1 'und Varianz 'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) / (n1 + n2 – 1) 'Die Testgröße z berechnet sich nun nach: 'z = ( U – UM ) / Wurzel aus Varianz 'wobei U die gemessene Anzahl der "runs" von '-' 'und '+' in der Reihe ist. 'z ist ungefähr standardnormalverteilt. 'Beispiel '13 3 14 14 1 14 3 8 14 17 9 14 13 2 16 1 3 12 13 14 ' 13 ' 3 ' 14 ' 14 ' 1 ' 14 ' 3 ' 8 ' 14 ' 17 ' 9 ' 14 ' 13 ' 2 ' 16 ' 1 ' 3 ' 12 ' 13 ' 14 'Median 13 Abzug von der Orginalreihe '0 -10 1 1 -12 1 -10 -5 1 4 -4 1 0 -11 3 -12 -10 -1 0 1 'Umwandlung in + und - '+ - + + - + - - + + - + + - + - - - + + '1 2 3 4 5 6 7 8 9 101112 13 'U ist die Zahl der Runs 'U = 13 runs bzw U: 13 'n1 = Pluszeichen '+': 11 'n2 = Minuszeichen '-': 9 'UM = (2*11*9)/(11+9) + 1 = 10,9 'varianz '= ... = 4,6 ???? 'σU = 2,1 'z = (13 - 10,9) / 2,1 = 1.0 'Entscheidung: Die Hypothese wird nicht abgelehnt. 'Die Elemente der Stichprobe sind vermutlich zufällig entnommen worden. 'Bei einem Signifikanzniveau von 0,05 wird H0 abgelehnt, wenn |z| > 1,96. Dies ist nicht der Fall. 'Entscheidung: Die Hypothese wird nicht abgelehnt. Die Elemente der Stichprobe sind vermutlich zufällig 'entnommen worden. 'that most of the z-scores for run lengths 1, 2, and 3 'have an absolute value greater than 1.96. 'This IS strong evidence that these data are 'IN fact NOT random. 'Siehe auch: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm 'http://www.wu-wien.ac.at/usr/stat2/melichar/spsspu1/spssk3-9.htm 'Bradley, (1968). Distribution-Free Statistical Tests, Chapter 12. ' END liste AS String[] PUBLIC SUB Button1_Click() DIM text AS String DIM median AS Float DIM liste AS String[] DIM posten AS String text = Textarea2.Text liste = Split(text,Chr(10)) 'umsortieren 'Länge bestimmen und richtige Formel verwenden, 'je nachdem ob die Länge gerade oder ungerade ist. IF liste.Length MOD 2 THEN PRINT liste.Length MOD 2 & " Ungerade" PRINT (liste.length + 1)/2 PRINT liste[(liste.length + 1)/2 - 1] median = Val(liste[(liste.length + 1)/2 - 1]) 'Der Array beginnt mit dem Element 0 nicht mit 1 ! ELSE PRINT liste.Length MOD 2 & " Gerade" median = (Val(liste[liste.length/2 - 1]) + Val(liste[liste.length/2]))/2 'Der Array beginnt mit dem Element 0 nicht mit 1 ! ENDIF textbox1.Text = Str(median) Button4.setfocus CATCH IF textarea1.Text = "" THEN message.info("Sie müssen im Textfeld 1 eine Werteliste eingeben") IF textarea2.Text = "" THEN message.info("Sie müssen erst umsortieren drücken") RETURN END PUBLIC SUB Button2_Click() 'umsortieren c AS Integer j AS Integer n AS Integer y AS Variant DIM Liste AS String[] element AS String txt AS String text AS String text = Textarea1.Text liste = Split(text,Chr(10)) y = 0 n = liste.length REPEAT c = 0 FOR j = 0 TO n - 2 'PRINT j,y,liste[0],ar[1],ar[2],ar[3],ar[4] IF Val(liste[j]) > Val(liste[j + 1]) THEN y = Val(liste[j]) liste[j] = liste[j + 1] liste[j + 1] = Str(y) c = 1 ENDIF NEXT UNTIL c = 0 FOR EACH element IN liste txt = txt & Str(element) & Chr(10) NEXT PRINT txt textarea2.Text = "" txt = Mid$(txt,1,-1) 'Der letzte Zeilenumbruch muß weg textarea2.Text = txt Button1.setfocus END PUBLIC SUB Button3_Click() textarea1.Text = "114,3" textarea1.Text = textarea1.Text & Chr(10) & "135,7" textarea1.Text = textarea1.Text & Chr(10) & "104,8" textarea1.Text = textarea1.Text & Chr(10) & "118,5" textarea1.Text = textarea1.Text & Chr(10) & "125,7" textarea1.Text = textarea1.Text & Chr(10) & "121,4" textarea1.Text = textarea1.Text & Chr(10) & "122,4" textarea1.Text = textarea1.Text & Chr(10) & "96,8" textarea1.Text = textarea1.Text & Chr(10) & "118,9" textarea1.Text = textarea1.Text & Chr(10) & "120" textarea1.Text = textarea1.Text & Chr(10) & "112,2" textarea1.Text = textarea1.Text & Chr(10) & "127,9" textarea1.Text = textarea1.Text & Chr(10) & "122,8" textarea1.Text = textarea1.Text & Chr(10) & "128,9" textarea1.Text = textarea1.Text & Chr(10) & "120,3" 'mw = 119,373 'varianz = 92,6016 'sigma = 9,62297 'median Button2.setfocus END PUBLIC SUB Button4_Click() 'median abziehen m AS Float d AS Float n AS Integer y AS Variant DIM Liste AS String[] element AS String txt AS String text AS String text = Textarea1.Text m = Val(textbox1.Text) liste = Split(text,Chr(10)) y = 0 n = liste.length FOR EACH element IN liste d = Val(element) - m 'PRINT element,m,d txt = txt & Str(d) & Chr(10) NEXT PRINT txt textarea3.Text = "" txt = Mid$(txt,1,-1) 'Der letzte Zeilenumbruch muß weg textarea3.Text = txt Button6.setfocus END PUBLIC SUB Button5_Click() 'in 1,0 Folge umwandeln e AS Integer DIM Liste AS String[] element AS String txt AS String text AS String text = Textarea3.Text liste = Split(text,Chr(10)) 'n = liste.length FOR EACH element IN liste IF Val(element) < 0 THEN e = 0 ELSE e = 1 ENDIF txt = txt & Str(e) & Chr(10) NEXT PRINT txt textarea4.Text = "" txt = Mid$(txt,1,-1) 'Der letzte Zeilenumbruch muß weg textarea4.Text = txt END PUBLIC SUB Button6_Click() DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String DIM ozaehler AS Integer DIM izaehler AS Integer DIM Liste AS String[] element AS String txt AS String text AS String text = Textarea4.Text liste = Split(text,Chr(10)) n = liste.length ozaehler = 0 izaehler = 0 FOR EACH element IN liste IF element = "0" THEN ozaehler = ozaehler + 1 IF element = "1" THEN izaehler = izaehler + 1 NEXT textbox2.Text = ozaehler textbox3.Text = izaehler textbox4.Text = ozaehler + izaehler END PUBLIC SUB Button11_Click() ME.Close END PUBLIC SUB Button7_Click() UM AS Float n1 AS Integer n2 AS Integer n1 = Val(textbox2.Text) n2 = Val(textbox3.Text) UM = 2 * n1 * n2 /( n1 + n2 ) + 1 textbox5.Text = Str(UM) END PUBLIC SUB Button8_Click() DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String charnext AS String DIM runzaehler AS Integer DIM Liste AS String[] element AS String txt AS String text AS String text = Textarea4.Text liste = Split(text,Chr(10)) n = liste.length FOR EACH element IN liste s = s & element NEXT runzaehler = 1 T = Trim(s) FOR n = 1 TO Len(T) - 1 char = Mid$(T, n, 1) charnext = Mid$(T, n + 1, 1) IF char <> charnext THEN runzaehler = runzaehler + 1 NEXT textbox6.Text = runzaehler END PUBLIC SUB Button9_Click() 'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) varianz AS Float n1 AS Integer n2 AS Integer zwei AS Integer summe AS Integer run AS Integer n1 = Val(textbox2.Text) n2 = Val(textbox3.Text) run = Val(textbox6.text) zwei = 2 * n1 * n2 summe = n1 + n2 PRINT zwei,summe,zwei * (zwei - summe), varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1)) 'varianz=(run * (run - 2))/(4 * (run - 1)) textbox7.Text = Str(varianz) IF varianz < 0 THEN varianz = -varianz textbox8.Text = Str(Sqr(varianz)) END PUBLIC SUB Button10_Click() z AS Float run AS Float UM AS Float svar AS Float run = Val(textbox6.text) UM = Val(textbox5.text) svar = Val(textbox8.text) z = ( run - UM)/svar textbox9.Text = Str(z) END PUBLIC SUB Button12_Click() z AS Float t1 AS String t2 AS String t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!" t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!" z = Val(textbox9.Text) IF z > 1.96 XOR z < -1.96 THEN textbox10.text = t2 ELSE textbox10.text = t1 ENDIF END PUBLIC SUB Button13_Click() 'noch ein paar Beispielwerte, sicher nicht zufällig textarea1.Text = "1" textarea1.Text = textarea1.Text & Chr(10) & "2" textarea1.Text = textarea1.Text & Chr(10) & "3" textarea1.Text = textarea1.Text & Chr(10) & "4" textarea1.Text = textarea1.Text & Chr(10) & "5" textarea1.Text = textarea1.Text & Chr(10) & "6" textarea1.Text = textarea1.Text & Chr(10) & "7" textarea1.Text = textarea1.Text & Chr(10) & "8" textarea1.Text = textarea1.Text & Chr(10) & "9" textarea1.Text = textarea1.Text & Chr(10) & "10" textarea1.Text = textarea1.Text & Chr(10) & "11" textarea1.Text = textarea1.Text & Chr(10) & "12" textarea1.Text = textarea1.Text & Chr(10) & "13" textarea1.Text = textarea1.Text & Chr(10) & "14" textarea1.Text = textarea1.Text & Chr(10) & "15" END
Vereinfachungen
[Bearbeiten]- Die Beispiele können mit dem Array Befehl viel schneller eingegeben werden.
- Das Sortieren kann mit dem Array befehl Array.sort stark vereinfacht werden.
- Das Ganze sollte mit einem Knopfdruck funktionieren.
- Die Setfocusbefehle sollten in der richtigen Reihenfolge durchlaufen
- Unterprogramme für die einzelnen Abschnitte wären übersichtlicher.
Das ganze funktioniert weniger fehlerträchtig, wenn alles auf einen Knopfdruck hin passiert. Trotzdem sollte man obige Version stehen lassen, das sie Schritt für Schritt vorgeht.
Runtest 2
[Bearbeiten]In etwas einfacherer Form wurde der Runtest noch einmal programmiert:
Man braucht dazu
- 9 Commandbuttons
- 9 Textboxen
- 1 Textarea
2 einfache Beispielfolgen wurden integriert.
Listing:
PUBLIC SUB Form_Open() 'Der Run-Test ist ein nichtparametrischer Test 'auf Stationarität bzw. Nicht-Korrelation 'IN einer Zeitreihe oder anderen Sequenz. 'Die abzulehnende Nullhypothese ist hier, 'dass aufeinanderfolgende Werte unkorreliert sind. 'Ein run oder "Lauf" ist definiert als eine Folge 'von gleichen Symbolen IN einer Symbolsequenz 'mit endlichem Alphabet. 'Aus einer Symbolsequenz muss zunächst eine numerische Reihe 'erzeugt werden 'Zunächst wird der Median der Reihe berechnet 'und von allen Werten abgezogen. 'IN der resultierenden Reihe werden negative Zahlen 'durch ein '-' und positive durch ein '+' ersetzt. 'Für Stichprobenumfänge n1,n2 > 10 ist '(mit n1,n2 gleich der Anzahl der "plus" und der "minus") 'die Wahrscheinlichkeitsverteilung der runs ungefähr normal 'mit dem Mittelwert UM = 2 * n1*n2 /(n1+n2) + 1 'und Varianz 'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) / (n1 + n2 – 1) 'Die Testgröße z berechnet sich nun nach: 'z = ( U – UM ) / Wurzel aus Varianz 'wobei U die gemessene Anzahl der "runs" von '-' 'und '+' in der Reihe ist. 'z ist ungefähr standardnormalverteilt. 'Beispiel '13 3 14 14 1 14 3 8 14 17 9 14 13 2 16 1 3 12 13 14 'Median 13 Abzug von der Orginalreihe '0 -10 1 1 -12 1 -10 -5 1 4 -4 1 0 -11 3 -12 -10 -1 0 1 'Umwandlung in + und - '+ - + + - + - - + + - + + - + - - - + + '1 2 3 4 5 6 7 8 9 101112 13 'U ist die Zahl der Runs 'U = 13 runs bzw U: 13 'n1 = Pluszeichen '+': 11 'n2 = Minuszeichen '-': 9 'UM = (2*11*9)/(11+9) + 1 = 10,9 'varianz '= ... = 4,6 ???? 'σU = 2,1 'z = (13 - 10,9) / 2,1 = 1.0 'Entscheidung: Die Hypothese wird nicht abgelehnt. 'Die Elemente der Stichprobe sind vermutlich zufällig entnommen worden. 'that most of the z-scores for run lengths 1, 2, and 3 'have an absolute value greater than 1.96. 'This IS strong evidence that these data are 'IN fact NOT random. 'Siehe auch: http://www.itl.nist.gov/div898/handbook/eda/section3/eda35d.htm 'http://www.wu-wien.ac.at/usr/stat2/melichar/spsspu1/spssk3-9.htm 'Bradley, (1968). Distribution-Free Statistical Tests, Chapter 12. ' END
PUBLIC SUB Button1_Click() ME.CLOSE END
PUBLIC SUB Button2_Click() DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String DIM ozaehler AS Integer DIM izaehler AS Integer s = textarea1.Text ozaehler = 0 izaehler = 0 T = Trim(s) FOR n = 1 TO Len(T) char = Mid$(T, n, 1) SELECT CASE TRUE CASE char = "0" ozaehler = ozaehler + 1 CASE char = "1" izaehler = izaehler + 1 END SELECT NEXT textbox1.Text = ozaehler textbox2.Text = izaehler textbox3.Text = ozaehler + izaehler END
PUBLIC SUB Button3_Click() 'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1 DIM a AS Integer DIM t AS String DIM M AS Integer Randomize() FOR a = 1 TO 200 M = Int(2 * Rnd) ' Erzeugt einen Wurf zwischen 0 und 1 t = t & LTrim$(Str$(M)) NEXT Textarea1.Text = t END
PUBLIC SUB Button4_Click() UM AS Float n1 AS Integer n2 AS Integer n1 = Val(textbox1.Text) n2 = Val(textbox2.Text) UM = 2 * n1 * n2 /( n1 + n2 ) + 1 'UM = 2 * n1*n2 /(n1+n2) + 1 'Mittelwert der Wahrscheinlichkeitsverteilung der runs textbox4.Text = Str(UM) END
PUBLIC SUB Button6_Click() 'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) 'Varianz der Wahrscheinlichkeitsverteilung der runs varianz AS Float n1 AS Integer n2 AS Integer zwei AS Integer summe AS Integer run AS Integer n1 = Val(textbox1.Text) n2 = Val(textbox2.Text) run = Val(textbox5.text) zwei = 2 * n1 * n2 summe = n1 + n2 PRINT zwei,summe,zwei * (zwei - summe), varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1)) 'varianz=(run * (run - 2))/(4 * (run - 1)) textbox6.Text = Str(varianz) IF varianz < 0 THEN varianz = -varianz textbox7.Text = Str(Sqr(varianz)) END
PUBLIC SUB Button7_Click() '+ - + + - + - - + + - + + - + - - - + + Textarea1.Text = "10110100110110100011" END
PUBLIC SUB Button5_Click() DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String charnext AS String DIM runzaehler AS Integer s = textarea1.Text runzaehler = 1 T = Trim(s) FOR n = 1 TO Len(T) - 1 char = Mid$(T, n, 1) charnext = Mid$(T, n + 1, 1) IF char <> charnext THEN runzaehler = runzaehler + 1 NEXT textbox5.Text = runzaehler END
PUBLIC SUB Button8_Click() z AS Float run AS Float UM AS Float svar AS Float run = Val(textbox5.text) UM = Val(textbox4.text) svar = Val(textbox7.text) z = ( run - UM)/svar 'z ist die Prüfvariable textbox8.Text = Str(z) END
PUBLIC SUB Button9_Click() z AS Float t1 AS String t2 AS String t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!" t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!" z = Val(textbox8.Text) IF z > 1.96 XOR z < -1.96 THEN textbox9.text = t2 ELSE textbox9.text = t1 ENDIF END
Abbildung des Programmablaufes für die 01 Folge Chaitin A
Runtest 3
[Bearbeiten]Das Programm wurde im Vergleich zu Runtest 2 noch einmal einfacher programmiert. Der Test läuft jetzt auf einen Click. 3 Beispiele wurden integriert.
Man braucht dazu
- 5 Commandbuttons
- 9 Textboxen
- 1 Textarea
3 einfache Beispielfolgen wurden integriert.
Code:
PUBLIC SUB Form_Open() ME.Text = "Runtest von Münzwürfen" END PUBLIC SUB Button1_Click() s AS String '10Folge aus der Textarea n AS Integer 'Laufvariable T AS String 'getrimmte 10 Folge aus s char AS String 'einzelne Position der 10 Folge oz AS Integer 'Zahl der Nullen iz AS Integer 'Zahl der Einser UM AS Float 'Mittelwert der Wahrscheinlichkeitsverteilung der runs runs AS Integer 'Zahl der runs charnext AS String 'nächste Position in der Folge varianz AS Float 'Varianz der Wahrscheinlichkeitsverteilung der runs zwei AS Integer summe AS Integer 'Hilfsvariablen zur Berechnung der Varianz svar AS Float 'Wurzel der Varianz z AS Float 'Prüfziffer t1 AS String t2 AS String 'Bewertungstexte '------0 und 1, UM Berechnung----------------- s = textarea1.Text oz = 0 iz = 0 T = Trim(s) FOR n = 1 TO Len(T) char = Mid$(T, n, 1) SELECT CASE TRUE CASE char = "0" oz = oz + 1 CASE char = "1" iz = iz + 1 END SELECT NEXT textbox1.Text = oz textbox2.Text = iz textbox3.Text = oz + iz UM = 2 * oz * iz /( oz + iz ) + 1 'Mittelwert der Wahrscheinlichkeitsverteilung der runs textbox4.Text = Str(UM) '---Runs---------------------------------------------- runs = 1 FOR n = 1 TO Len(T) - 1 char = Mid$(T, n, 1) charnext = Mid$(T, n + 1, 1) IF char <> charnext THEN runs = runs + 1 NEXT textbox5.Text = runs '-------Varianz---------------------------------------------- 'varianz = 2*n1*n2*(2*n1*n2 – n1 – n2) / (n1 + n2) / (n1 + n2) 'Varianz der Wahrscheinlichkeitsverteilung der runs zwei = 2 * oz * iz summe = oz + iz 'PRINT zwei,summe,zwei * (zwei - summe), varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1)) textbox6.Text = Str(varianz) IF varianz < 0 THEN varianz = -varianz textbox7.Text = Str(Sqr(varianz)) svar = Sqr(varianz) z = ( runs - UM)/svar 'z ist die Prüfvariable textbox8.Text = Str(z) '-------Bewertung------------------------------------------ t1 = "Die Meßwerte sind mit einem p <0,05 zufällig erhoben worden!" t2 = "Die Meßwerte sind mit einem p <0,05 NICHT zufällig erhoben worden!" IF z > 1.96 XOR z < -1.96 THEN textbox9.text = t2 ELSE textbox9.text = t1 ENDIF END PUBLIC SUB Button2_Click() '+ - + + - + - - + + - + + - + - - - + + Textarea1.Text = "10110100110110100011" END PUBLIC SUB Button3_Click() 'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1 DIM a AS Integer DIM t AS String DIM M AS Integer Randomize() FOR a = 1 TO 200 M = Int(2 * Rnd) ' Erzeugt einen Wurf zwischen 0 und 1 t = t & LTrim$(Str$(M)) NEXT Textarea1.Text = t END PUBLIC SUB Button4_Click() ME.CLOSE END PUBLIC SUB Button5_Click() Textarea1.Text = "10101010101010101010" END
Entropie bei einfachen 01 Folgen
[Bearbeiten]Die Entropie ist ein Begriff der viel gebraucht aber wenig verstanden wird. In der Statistik wird der Begriff noch wenig genutzt, obwohl er eigentlich ein grundlegender Begriff sein könnte.
- Siehe http://de.wikipedia.org/wiki/Entropie_(Informationstheorie)
- Siehe http://www.madeasy.de/2/entropie.htm
- Siehe http://www.madeasy.de/2/zufallgz.htm
Im folgenden werden einige einfache Gambasprogramme augelistet und beschrieben, die die Entropieberechnung einfacher 01 Folgen schrittweise erarbeiten sollen.
Vorübung1
[Bearbeiten]Im folgenden Programm werden systematisch alle Möglichkeiten einer zunehmend längeren 01 Folge aufgelistet. Sie brauchen nur eine leere Form, um das Programm in Gang zu bekommen. Die Ausgabe erfolgt im Direktfenster.
PUBLIC SUB Form_Open() 'Dieses Programm zaehlt im Binaersystem von 1 bis 2^8 'Die vorderen Leerräume werden mit Null aufgefüllt. s AS Integer z AS Integer t AS String FOR s = 1 TO 8 FOR z = 0 TO (2^s - 1) t = Bin$(z,s) PRINT t NEXT NEXT END
Ausgabe:
0 1 00 01 10 11 000 001 010 011 100 101 110 111 0000 0001 0010 0011 0100
Vorübung2
[Bearbeiten]In einer zweiten Vorübung werden jetzt allen Binärzahlen Entropiewerte zugeordnet, die ganz grob vereinfacht ( und damit noch ziemlich falsch) berechnet werden. Eine ganz geordnete 01 Folge hat dabei immer den Entropiewert 0. Eine völlig zufällige 01 Folge hat einen Entropiewert, der ihrer Länge entspricht.
Beispiel:
- 00000000000000000000 Entropie = 0
- 01101100110111100010 Entropie = 20
Vorsicht die berechneten Entropiewerte sind noch ziemlich falsch !!
' Gambas class file t AS String PUBLIC SUB Form_Open() s AS Integer z AS Integer n AS Integer e AS Integer n = 0 FOR s = 1 TO 10 FOR z = 0 TO (2^s - 1) t = Bin$(z,s) PRINT "n,t " & n,t; e = ent(t) PRINT " E = " & e n = n + 1 NEXT NEXT END PUBLIC FUNCTION ent(e AS Integer) AS Integer oz AS Integer iz AS Integer gz AS Integer char AS String te AS String n AS Integer oz = 0 iz = 0 gz = 0 te = Trim(t) FOR n = 1 TO Len(te) char = Mid$(te, n, 1) SELECT CASE TRUE CASE char = "0" oz = oz + 1 CASE char = "1" iz = iz + 1 END SELECT gz = oz + iz NEXT PRINT " gz,oz,iz " & gz,oz,iz; IF oz > iz THEN e = gz - oz 'IF oz > 0.6*iz THEN e = gz - oz Else runstest IF oz < iz THEN e = oz 'IF oz < 0.4*iz THEN e = oz Else runstest IF oz = iz THEN e = gz 'IF oz = iz THEN runstest RETURN e END
10Statistik
[Bearbeiten]Man kann an das Problem der Unterscheidung zufälliger und nichtzufälliger 01 Folgen auch noch anders herangehen. Eine Möglichkeit zeigt das folgende Programm 01Statistik.
Das Programm kann an an Hand der Beispiele, die in ihm enthalten sind, leicht ausgetestet werden. Man kann jede beliebige 01 Folge in die Textarea kopieren und auswerten lassen. Es werden nur Runs bis maximal einer Länge von 10 berücksichtigt.
Sie brauchen
- viele Befehlsbuttons
- viele Textboxen
- eine Textarea
um das Programm in Gang zu bringen.
Siehe auch: http://www.madeasy.de/2/prg01st.htm ( Noch in VB , Layout blieb gleich)
' Gambas class file t AS String PUBLIC SUB Button9_Click() ME.Close END PUBLIC SUB Button2_Click() 'diese Funktion soll eine 01 Datei untersuchen 'Sie soll die Zahl der 00 Paare zurueckgeben 'io,oi,oo Zahl der anderen Paare DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String DIM oozaehler AS Integer DIM oizaehler AS Integer DIM iozaehler AS Integer DIM iizaehler AS Integer s = textarea1.Text oozaehler = 0 oizaehler = 0 iozaehler = 0 iizaehler = 0 T = Trim(s) FOR n = 1 TO Len(T) STEP 2 char = Mid$(T, n, 2) SELECT CASE TRUE CASE char = "00" oozaehler = oozaehler + 1 CASE char = "01" oizaehler = oizaehler + 1 CASE char = "10" iozaehler = iozaehler + 1 CASE char = "11" iizaehler = iizaehler + 1 END SELECT NEXT textbox4.Text = oozaehler textbox5.Text = oizaehler textbox6.Text = iozaehler textbox7.Text = iizaehler END PUBLIC SUB Button1_Click() 'Wieviel 1 und 0 finden sich in der Folge ? DIM s AS String DIM n AS Integer DIM T AS String DIM char AS String DIM ozaehler AS Integer DIM izaehler AS Integer s = textarea1.Text ozaehler = 0 izaehler = 0 T = Trim(s) FOR n = 1 TO Len(T) char = Mid$(T, n, 1) SELECT CASE TRUE CASE char = "0" ozaehler = ozaehler + 1 CASE char = "1" izaehler = izaehler + 1 END SELECT NEXT textbox1.Text = ozaehler textbox2.Text = izaehler textbox3.Text = ozaehler + izaehler END PUBLIC SUB Button6_Click() 'mehrfacher Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1 DIM a AS Integer DIM t AS String DIM M AS Integer Randomize() FOR a = 1 TO 20000 M = Int(2 * Rnd) ' Erzeugt einen Wurf zwischen 0 und 1 t = t & LTrim$(Str$(M)) NEXT Textarea1.Text = t END PUBLIC SUB Button8_Click() M AS String t AS String a AS Integer FOR a = 1 TO 10000 M = "10" t = t & LTrim$(Str$(M)) NEXT Textarea1.Text = t END PUBLIC SUB Button4_Click() DIM s AS String DIM n AS Integer DIM T AS String DIM Tempo AS String DIM char AS String a AS Integer DIM o1 AS Integer DIM o2 AS Integer DIM o3 AS Integer DIM o4 AS Integer DIM o5 AS Integer DIM o6 AS Integer DIM o7 AS Integer DIM o8 AS Integer DIM o9 AS Integer DIM oa AS Integer s = textarea1.Text T = Trim(s) ' 'Rem diese Funktion soll eine 01 Datei untersuchen ' 'Rem Sie soll die Zahl der 000,0000,00000 etc ( der runs ) zurueckgeben o1 = 0 o2 = 0 o3 = 0 o4 = 0 o5 = 0 o6 = 0 o7 = 0 o8 = 0 o9 = 0 oa = 0 ' 'Rem 00000000001000000000010000000000 ' Cls Tempo = RTrim$(LTrim$(s)) ' 'Rem a = 10 a = 10 ' 'Rem PRINT Mid$(Temp, 1, 11) IF Mid$(Tempo, 1, a + 1) = "00000000001" THEN oa = oa + 1 ' 'Rem PRINT Mid$(Temp, Len(Temp) - 10, 11) IF Len(Tempo) < a THEN GOTO a9 IF Len(Tempo) = a AND s = "0000000000" THEN oa = oa + 1 IF Len(Tempo) = a THEN GOTO a9 IF Mid$(Tempo, Len(Tempo) - 10, 11) = "10000000000" THEN oa = oa + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "100000000001" THEN oa = oa + 1 'Rem PRINT Mid$(Tempo, n, a) NEXT ' a9: ' 'Rem a = 9 a = 9 'Rem 00000000010000000001000000000 ' 'Rem PRINT Mid$(Temp, 1, 10) IF Mid$(Tempo, 1, 10) = "0000000001" THEN o9 = o9 + 1 'Rem PRINT Mid$(Temp, Len(Temp) - 9, 10) IF Len(Tempo) < a THEN GOTO a8 IF Len(Tempo) = a AND s = "000000000" THEN o9 = o9 + 1 IF Len(Tempo) = a THEN GOTO a8 IF Mid$(Tempo, Len(Tempo) - 9, 10) = "1000000000" THEN o9 = o9 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "10000000001" THEN o9 = o9 + 1 ' 'Rem PRINT Mid$(Temp, n, a) NEXT ' a8: ' 'Rem a = 8 a = 8 ' 'Rem 00000000100000000100000000 ' 'Rem PRINT Mid$(Temp, 1, a + 1) IF Mid$(Tempo, 1, a + 1) = "000000001" THEN o8 = o8 + 1 'Rem PRINT Mid$(Temp, Len(Temp) - a, a + 1) IF Len(Tempo) < a THEN GOTO a7 IF Len(Tempo) = a AND s = "00000000" THEN o8 = o8 + 1 IF Len(Tempo) = a THEN GOTO a7 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "1000000001" THEN o8 = o8 + 1 ' 'Rem PRINT Mid$(Temp, n, a) NEXT ' a7: ' 'Rem a = 7 a = 7 ' 'Rem 00000000100000000100000000 IF Mid$(Tempo, 1, a + 1) = "00000001" THEN o7 = o7 + 1 IF Len(Tempo) < a THEN GOTO a6 IF Len(Tempo) = a AND s = "0000000" THEN o7 = o7 + 1 IF Len(Tempo) = a THEN GOTO a6 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10000000" THEN o7 = o7 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "100000001" THEN o7 = o7 + 1 NEXT ' a6: ' 'Rem a = 6 a = 6 ' 'Rem 00000010000001000000 IF Mid$(Tempo, 1, a + 1) = "0000001" THEN o6 = o6 + 1 IF Len(Tempo) < a THEN GOTO a5 IF Len(Tempo) = a AND s = "000000" THEN o6 = o6 + 1 IF Len(Tempo) = a THEN GOTO a5 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "1000000" THEN o6 = o6 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "10000001" THEN o6 = o6 + 1 NEXT ' a5: ' 'Rem a = 5 a = 5 ' 'Rem 00000100000100000 IF Mid$(Tempo, 1, a + 1) = "000001" THEN o5 = o5 + 1 IF Len(Tempo) < a THEN GOTO a4 IF Len(Tempo) = a AND s = "00000" THEN o5 = o5 + 1 IF Len(Tempo) = a THEN GOTO a4 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "100000" THEN o5 = o5 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "1000001" THEN o5 = o5 + 1 NEXT ' a4: ' 'Rem a = 4 a = 4 ' 'Rem 00001000010000 IF Mid$(Tempo, 1, a + 1) = "00001" THEN o4 = o4 + 1 IF Len(Tempo) < a THEN GOTO a3 IF Len(Tempo) = a AND s = "0000" THEN o4 = o4 + 1 IF Len(Tempo) = a THEN GOTO a3 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10000" THEN o4 = o4 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "100001" THEN o4 = o4 + 1 NEXT a3: a = 3 ' 'Rem 00010001000 IF Mid$(Tempo, 1, a + 1) = "0001" THEN o3 = o3 + 1 IF Len(Tempo) < a THEN GOTO a2 IF Len(Tempo) = a AND s = "000" THEN o3 = o3 + 1 IF Len(Tempo) = a THEN GOTO a2 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "1000" THEN o3 = o3 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "10001" THEN o3 = o3 + 1 NEXT ' a2: a = 2 ' 'Rem 00100100 IF Mid$(Tempo, 1, a + 1) = "001" THEN o2 = o2 + 1 IF Len(Tempo) < a THEN GOTO aeins IF Len(Tempo) = a AND s = "00" THEN o2 = o2 + 1 IF Len(Tempo) = a THEN GOTO aeins IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "100" THEN o2 = o2 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "1001" THEN o2 = o2 + 1 NEXT aeins: a = 1 ' 'Rem 01010 IF Mid$(Tempo, 1, a + 1) = "01" THEN o1 = o1 + 1 IF Len(Tempo) < a THEN GOTO a0 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "10" THEN o1 = o1 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "101" THEN o1 = o1 + 1 NEXT ' a0: textbox8.Text = o1 textbox9.Text = o2 textbox10.Text = o3 textbox11.Text = o4 textbox12.Text = o5 textbox13.Text = o6 textbox14.Text = o7 textbox15.Text = o8 textbox16.Text = o9 textbox17.Text = oa END PUBLIC SUB Button7_Click() 'muss noch erstellt werden END PUBLIC SUB Button5_Click() 'diese Funktion soll eine 01 Datei 'untersuchen 'Sie soll die Zahl der 11,111,1111,11111 Runs etc zurueckgeben DIM s AS String DIM n AS Integer DIM T AS String DIM Tempo AS String DIM char AS String a AS Integer DIM i1 AS Integer DIM i2 AS Integer DIM i3 AS Integer DIM i4 AS Integer DIM i5 AS Integer DIM i6 AS Integer DIM i7 AS Integer DIM i8 AS Integer DIM i9 AS Integer DIM ia AS Integer s = textarea1.Text T = Trim(s) i1 = 0 i2 = 0 i3 = 0 i4 = 0 i5 = 0 i6 = 0 i7 = 0 i8 = 0 i9 = 0 ia = 0 Tempo = RTrim$(LTrim$(s)) ' 'Rem 11111111110111111111101111111111 ' Cls a = 10 ' 'Rem PRINT Mid$(Temp, 1, 11) IF Mid$(Tempo, 1, a + 1) = "11111111110" THEN ia = ia + 1 ' 'Rem PRINT Mid$(Temp, Len(Temp) - 10, 11) IF Len(Tempo) < a THEN GOTO b9 IF Len(Tempo) = a AND s = "1111111111" THEN ia = ia + 1 IF Len(Tempo) = a THEN GOTO b9 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111111111" THEN ia = ia + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "011111111110" THEN ia = ia + 1 ' 'Rem PRINT Mid$(Temp, n, a) NEXT b9: a = 9 IF Mid$(Tempo, 1, 10) = "1111111110" THEN i9 = i9 + 1 IF Len(Tempo) < a THEN GOTO b8 IF Len(Tempo) = a AND s = "111111111" THEN i9 = i9 + 1 IF Len(Tempo) = a THEN GOTO b8 IF Mid$(Tempo, Len(Tempo) - 9, 10) = "0111111111" THEN i9 = i9 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "01111111110" THEN i9 = i9 + 1 NEXT b8: a = 8 IF Mid$(Tempo, 1, a + 1) = "111111110" THEN i8 = i8 + 1 IF Len(Tempo) < a THEN GOTO b7 IF Len(Tempo) = a AND s = "11111111" THEN i8 = i8 + 1 IF Len(Tempo) = a THEN GOTO b7 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011111111" THEN i8 = i8 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "0111111110" THEN i8 = i8 + 1 NEXT ' b7: a = 7 IF Mid$(Tempo, 1, a + 1) = "11111110" THEN i7 = i7 + 1 IF Len(Tempo) < a THEN GOTO b6 IF Len(Tempo) = a AND s = "1111111" THEN i7 = i7 + 1 IF Len(Tempo) = a THEN GOTO b6 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111111" THEN i7 = i7 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "011111110" THEN i7 = i7 + 1 NEXT ' b6: a = 6 IF Mid$(Tempo, 1, a + 1) = "1111110" THEN i6 = i6 + 1 IF Len(Tempo) < a THEN GOTO b5 IF Len(Tempo) = a AND s = "111111" THEN i6 = i6 + 1 IF Len(Tempo) = a THEN GOTO b5 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "0111111" THEN i6 = i6 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "01111110" THEN i6 = i6 + 1 NEXT ' b5: a = 5 ' IF Mid$(Tempo, 1, a + 1) = "111110" THEN i5 = i5 + 1 IF Len(Tempo) < a THEN GOTO b4 IF Len(Tempo) = a AND s = "11111" THEN i5 = i5 + 1 IF Len(Tempo) = a THEN GOTO b4 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011111" THEN i5 = i5 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "0111110" THEN i5 = i5 + 1 NEXT b4: a = 4 IF Mid$(Tempo, 1, a + 1) = "11110" THEN i4 = i4 + 1 IF Len(Tempo) < a THEN GOTO b3 IF Len(Tempo) = a AND s = "1111" THEN i4 = i4 + 1 IF Len(Tempo) = a THEN GOTO b3 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01111" THEN i4 = i4 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "011110" THEN i4 = i4 + 1 NEXT ' b3: a = 3 IF Mid$(Tempo, 1, a + 1) = "1110" THEN i3 = i3 + 1 IF Len(Tempo) < a THEN GOTO b2 IF Len(Tempo) = a AND s = "111" THEN i3 = i3 + 1 IF Len(Tempo) = a THEN GOTO b2 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "0111" THEN i3 = i3 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "01110" THEN i3 = i3 + 1 NEXT ' b2: a = 2 IF Mid$(Tempo, 1, a + 1) = "110" THEN i2 = i2 + 1 IF Len(Tempo) < a THEN GOTO beins IF Len(Tempo) = a AND s = "11" THEN i2 = i2 + 1 IF Len(Tempo) = a THEN GOTO beins IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "011" THEN i2 = i2 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "0110" THEN i2 = i2 + 1 NEXT beins: a = 1 IF Mid$(Tempo, 1, a + 1) = "10" THEN i1 = i1 + 1 IF Len(Tempo) < a THEN GOTO b0 IF Mid$(Tempo, Len(Tempo) - a, a + 1) = "01" THEN i1 = i1 + 1 FOR n = 1 TO Len(Tempo) IF Mid$(Tempo, n, a + 2) = "010" THEN i1 = i1 + 1 NEXT ' b0: textbox18.Text = i1 textbox19.Text = i2 textbox20.Text = i3 textbox21.Text = i4 textbox22.Text = i5 textbox23.Text = i6 textbox24.Text = i7 textbox25.Text = i8 textbox26.Text = i9 textbox27.Text = ia END PUBLIC SUB Button10_Click() 'Chaitin , ein bekannter Zufallsforscher gab IN einem Aufsatz folgende Sequenz an 'Lit chaitin G.J. 1975 scientific American 232 S 47 -52 t = "01101100110111100010" textarea1.Text = t END PUBLIC SUB Button11_Click() 'Chaitin , ein bekannter Zufallsforscher gab IN einem Aufsatz folgende Sequenz an '01101100110111100010 'Diese Folge wurde veraendert , 'so dass nach jeder Ziffer ihr Gegenteil folgt, t = "0110100110100101101001101010100101011001" textarea1.Text = t ' Rem Wie man zb an Hand der ungleichen Paarverteilung gut erkennen kann , wird der Zufall weniger ' Rem Obwohl auf den ersten Blick ohne Kenntnis der Entstehung ' Rem vielleicht sogar mehr Zufall zu erwarten ist END PUBLIC SUB Button12_Click() 'Zufallszahl die durch mehrfachen echten Muenzwurf zur Erzeugung einer Zufallsfolge von 0 und 1 'ermittelt wurde. t = "101101101010100111001011001110000001111001010000111101010001001101111011000010001010100011101110010101110111111100000100110100001101110111101010110000010001110110001000000100111110000011111010010001101111001010100000101101000011000110100011001111011111000110111001001100000011111001000000110000100000011010101000001100010110000111001111001000011011111111001001010100111110010001001000010010010000100010100111001111011000001010011111110010111110111011000111011010110000011101100111101011001110" textarea1.Text = t END PUBLIC SUB Button13_Click() 'BB ,die orginalfolge von Chaitin wird einfach 2 * hintereinander geschrieben t = "0110110011011110001001101100110111100010" textarea1.Text = t END PUBLIC SUB Button14_Click() 'Dieser Befehl zaehlt im Binaersystem von 1 bis 2000 'er listet die Zahlen ohne Zwischenraum hintereinander '012345678... 0.1.10.11.100.101.110 etc te AS String z AS Integer FOR z = 0 TO 2000 t = Bin$(z) te = te & t NEXT textarea1.Text = te END
Das Programm ist ein bißchen lang geraten. Es kann mit Sicherheit verbessert werden. Es hat die Limitation, daß es Runs nur bis zu einer Länge von 10 erfasst.
Vorübung3: Programmierung des Problems mit dem Runtest
[Bearbeiten]Zitat: Wenn du es nicht programmiert hast, dann hast du es nicht verstanden.
Leider funktioniert der Runtest nicht bei beliebigen 01 Sequenzen , sondern nur wenn die Zahl von 0 und 1 ungefähr gleich ist. Beispielsweise kann man eine Sequenz 00000000000000000010 im Runtest nicht auf ihre Zufälligkeit überprüfen.
Im Unterschied zur Vorübung2 werden jetzt für die Binärzahlen, bei denen die Zahl der Nullen gleich der Zahl der Einser ist, die Entropien mit dem Runstest berechnet.
- Die Länge der 01 Folge ist variierbar , hier s = 8. ( Länge ist die Variable s im Listing)
- Die Zahl der Nullen und Einsen ist zur Vereinfachung gleich groß.
- Das Programm startet von alleine.
- Die Ergebnisausgabe erfolgt im Direkfenster.
- Bewertung:
- pz Werte um die 0 sind ein Zeichen hoher Entropie. Pz-Werte über 1,5 oder unter -1,5 sind ein Zeichen niedriger Entropie
PUBLIC SUB Form_Open() s AS Integer 'Laenge der Binaerzahl z AS Integer 'Zaehler von 0 bis 2^s-1 zz AS Integer 'Zaehler von 1 bis alle Varianten mit ozaehler = izaehler t AS String 'binaerzahl ozaehler AS Integer 'Zahl der Nullen izaehler AS Integer 'Zahl der Einser tt AS String 'binaerzahl als String n AS Integer 'Laenge der Binaerzahl char AS String UM AS Float varianz AS Float svar AS Float 'Quadratwurzel der Varianz zwei AS Integer summe AS Integer run AS Integer nn AS Integer chari AS String charnext AS String runzaehler AS Integer pz AS Float 'Pruefvariable entspricht dem Entropiewert der Folge 'pz Werte um die 0 sind ein Zeichen hoher Entropie. 'pz-Werte > 1,5 oder < -1,5 sind ein Zeichen niedriger Entropie s = 10 'Laenge der 01 Folge zz = 0 FOR z = 0 TO (2^s - 1) t = Bin$(z,s) tt = Str(t) 'PRINT "tt = " & tt ozaehler = 0 izaehler = 0 FOR n = 1 TO Len(tt) char = Mid$(tt, n, 1) SELECT CASE TRUE CASE char = "0" ozaehler = ozaehler + 1 CASE char = "1" izaehler = izaehler + 1 END SELECT NEXT 'PRINT izaehler 'PRINT ozaehler IF izaehler = ozaehler THEN zz = zz + 1 t = tt PRINT "zz = " & zz & " t = " & t; 'runtest UM = 2 * s/2 * s/2 /( s/2 + s/2 ) + 1 'PRINT "UM = " & UM zwei = 2 * s/2 * s/2 summe = s varianz = zwei *( zwei - summe) / (summe * summe * (summe - 1)) IF varianz < 0 THEN varianz = -varianz 'PRINT "Varianz = " & varianz runzaehler = 1 FOR nn = 1 TO Len(t) - 1 chari = Mid$(t, nn, 1) charnext = Mid$(t, nn + 1, 1) IF chari <> charnext THEN runzaehler = runzaehler + 1 NEXT 'PRINT " runzaehler = " & runzaehler; svar = Sqr(varianz) pz = ( runzaehler - UM)/svar PRINT " pz = " & Str(pz) 'PRINT Str(pz) ENDIF NEXT END
Ergebnisausgabe:
zz = 1 t = 00001111 pz = -2,291287847478 zz = 2 t = 00010111 pz = -0,763762615826 zz = 3 t = 00011011 pz = -0,763762615826 zz = 4 t = 00011101 pz = -0,763762615826 zz = 5 t = 00011110 pz = -1,527525231652 zz = 6 t = 00100111 pz = -0,763762615826 zz = 7 t = 00101011 pz = 0,763762615826 zz = 8 t = 00101101 pz = 0,763762615826 zz = 9 t = 00101110 pz = 0 zz = 10 t = 00110011 pz = -0,763762615826 zz = 11 t = 00110101 pz = 0,763762615826 zz = 12 t = 00110110 pz = 0 zz = 13 t = 00111001 pz = -0,763762615826 zz = 14 t = 00111010 pz = 0 zz = 15 t = 00111100 pz = -1,527525231652 zz = 16 t = 01000111 pz = -0,763762615826 zz = 17 t = 01001011 pz = 0,763762615826 zz = 18 t = 01001101 pz = 0,763762615826 zz = 19 t = 01001110 pz = 0 zz = 20 t = 01010011 pz = 0,763762615826 zz = 21 t = 01010101 pz = 2,291287847478 zz = 22 t = 01010110 pz = 1,527525231652 zz = 23 t = 01011001 pz = 0,763762615826 zz = 24 t = 01011010 pz = 1,527525231652 zz = 25 t = 01011100 pz = 0 zz = 26 t = 01100011 pz = -0,763762615826 zz = 27 t = 01100101 pz = 0,763762615826 zz = 28 t = 01100110 pz = 0 zz = 29 t = 01101001 pz = 0,763762615826 zz = 30 t = 01101010 pz = 1,527525231652 zz = 31 t = 01101100 pz = 0 zz = 32 t = 01110001 pz = -0,763762615826 zz = 33 t = 01110010 pz = 0 zz = 34 t = 01110100 pz = 0 zz = 35 t = 01111000 pz = -1,527525231652 zz = 36 t = 10000111 pz = -1,527525231652 zz = 37 t = 10001011 pz = 0 zz = 38 t = 10001101 pz = 0 zz = 39 t = 10001110 pz = -0,763762615826 zz = 40 t = 10010011 pz = 0 zz = 41 t = 10010101 pz = 1,527525231652 zz = 42 t = 10010110 pz = 0,763762615826 zz = 43 t = 10011001 pz = 0 zz = 44 t = 10011010 pz = 0,763762615826 zz = 45 t = 10011100 pz = -0,763762615826 zz = 46 t = 10100011 pz = 0 zz = 47 t = 10100101 pz = 1,527525231652 zz = 48 t = 10100110 pz = 0,763762615826 zz = 49 t = 10101001 pz = 1,527525231652 zz = 50 t = 10101010 pz = 2,291287847478 zz = 51 t = 10101100 pz = 0,763762615826 zz = 52 t = 10110001 pz = 0 zz = 53 t = 10110010 pz = 0,763762615826 zz = 54 t = 10110100 pz = 0,763762615826 zz = 55 t = 10111000 pz = -0,763762615826 zz = 56 t = 11000011 pz = -1,527525231652 zz = 57 t = 11000101 pz = 0 zz = 58 t = 11000110 pz = -0,763762615826 zz = 59 t = 11001001 pz = 0 zz = 60 t = 11001010 pz = 0,763762615826 zz = 61 t = 11001100 pz = -0,763762615826 zz = 62 t = 11010001 pz = 0 zz = 63 t = 11010010 pz = 0,763762615826 zz = 64 t = 11010100 pz = 0,763762615826 zz = 65 t = 11011000 pz = -0,763762615826 zz = 66 t = 11100001 pz = -1,527525231652 zz = 67 t = 11100010 pz = -0,763762615826 zz = 68 t = 11100100 pz = -0,763762615826 zz = 69 t = 11101000 pz = -0,763762615826 zz = 70 t = 11110000 pz = -2,291287847478
Abbildung Grafische Darstellung der Entropiewerte einer 8er 01 Folge. Je größer die Säulen, desto kleiner ist die Entropie. Je näher die Säule bei Null liegt desto größer ist die Entropie.