Gambas: Statistik

Aus Wikibooks


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.

Screenshot Mittelwert, Varianz und Standardabweichung berechnen

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.

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.