0 Daumen
675 Aufrufe

Aufgabe:

Schreiben Sie eine Blockformel anova, die als Eingabe die Argumenten data und α annimmt. Dabei ist α ein Signifikanzniveau, data ist eine Liste, die als ihre Glieder die beliebige Anzahl k von Listen der reellen Zahlen hat (weiter – Gruppen), welche als Beobachtungen von bestimmten Zufallsvariablen
angesehen werden Können. Angenommen wird, dass data die Voraussetzungen für die Varianzanalyse (nämlich Homoskedastizität, Normalverteilung der Residuen) erfüllt. Die Formel führt anschließend die Varianzanalyse durch, um zu überprüfen, ob die Mittelwerte innerhalb der k Gruppen gleich sind. Genauer, die 0-Hypothese
H0 :μ1 =μ2 =...=μk
muss gegenüber der Alternative
H1 : μi ̸= μj für mindestens ein Paar i,j
zum Signifikanzniveau α getestet werden. Es sollen zudem folgende Zwischenschritte ausgegeben wer- den:
Globales arithmetisches Mittel, bzw. das arithmetische Mittel aller Beobachtungen;
Die Liste von arithmetischen Mittels innerhalb von k Gruppen;
SSE, bzw. die Residualvarianz;
SST, bzw. die totale Varianz;
Teststatistik;
Ablehnungsbereich;
Testergebnis.

Beispiel der Eingabe und der Ausgabe:

IMG_7136.jpeg


Vorsicht! Sie dürfen den systemeigenen Befehl zur Durchführung einer Varianzanalyse nicht verwen- den.


Ansatz:

IMG_7138.jpeg

Avatar von

Hast du eine Frage zu der Aufgabe?

und was ist jetzt deine frage?

btw: deine varianzen fallen mir, ohne einen rechenstab in die hand zu nehmen, etwas üppig aus?

Bei der Beispielausgabe und meinem Versuch sind die Teststatistik, Ablehnungsberuch und das Testergebnis anders. Außerdem weiß ich nicht, wie ich SSE und SST berechne

Wenn du innerhalb der Funktion block Variablen einen Wert zuweist, dann sind diese Variablen auch außerhalb der Funktion sichtbar.

Zum Beispiel

Eingabe:

f(n) := block(x: n)$
f(5)$
x;

Ausgabe:

5

Das kann zu unerwarteten Nebenwirkungen führen. Um diese zu verhindern kannst du der Funktion als erstes Argument eine Liste von Zuweisungen übergeben. Innerhalb dieser Liste darfst du aber nicht auf Variablen zugreifen, die dort definiert wurden.

Folgendes funktioniert deshalb nicht wie vielleicht erwartet:

abc(a, b, c) := block(
[
p: b/a,
q: c/a,
x1: -p/2 - sqrt((p/2)^2 - q),
x2: -p/2 + sqrt((p/2)^2 - q)
],
if x_1 = x_2 then x_1 else [x_1,x_2]
);

Stattdesssen:

abc(a, b, c) := block(
[
p: b/a,
q: c/a,
x1: 0,
x2: 0
],
x1: -p/2 - sqrt((p/2)^2 - q),
x2: -p/2 + sqrt((p/2)^2 - q),
if x_1 = x_2 then x_1 else [x_1,x_2]
);

Jetzt sind p, q, x1 und x2 lokale Variablen.

1 Antwort

0 Daumen

entsprechend

https://www.quality.de/lexikon/varianzanalyse-anova/

komm ich auf (ohne Gewähr)

anova(data,a):=block(
  [dta:flatten(data)],
  N:length(dta),
  globalmean:mean(dta),
  numberofgroups:length(data),
  groupmean:map(lambda([u], apply("+",u)/length(u)),data),
  groupvar:map(lambda([u], apply("+",u*u)/(length(u)-1) ),data-groupmean),  
  groupvarmean:apply("+",groupvar)/length(groupvar),
  meanvar:apply("+",(groupmean-mean(groupmean))^2)/(length(groupmean)-1),
  elementsofgroups:map(lambda([u], length(u) ),data),
  SQA:apply("+",(groupmean-globalmean)^2*elementsofgroups),
  SQR:apply("+",(elementsofgroups-1)*groupvar),
  print("global mean: ",globalmean," groups:",numberofgroups),
  print("groups mean: ",groupmean),
  print("groups var: ", groupvar),
  print("SQA: ",SQA," MQA:",SQA/(numberofgroups-1)),
  print("SQR: ",SQR," MQR:",SQR/(N-numberofgroups)),
  F:SQA/SQR/(numberofgroups-1)*(N-numberofgroups),
  q:quantile_f(1-a,numberofgroups-1,N-numberofgroups),
  if (F > q) then(
      print("Teststatik: F ",F," > Q ",q),
      print("Nullhypothese abgelehnt => Mittelwerte sind signifikant unterschiedlich bei a=",a,"")
  )else(
      print("Teststatik: F ",F," < Q ",q),
      print("Nullhypothese nicht abgelehnt => Mittelwerte sind nicht signifikant unterschiedlich bei a=",a,"")
  ),
  print("p-Wert (Wahrsch. > F) ",1-cdf_f(F,numberofgroups-1,N-numberofgroups),"")
)$


auf den Wer F zur Teststatistik - kannt Du selber klären, wie das was nach F kommt, zu deiner Vorlesung passt?

Avatar von 21 k

Ich habe es so gemacht:

anova \( ( \) data, \( \alpha):= \) block (
[dta:flatten(data)],
globalmean:apply("+",dta)/length(dta)
groups:length(data)
groupmean:map(lambda([u],
apply("+",u)/ length(u)), data),
gqm:data-groupmean,
groupsN:map(lambda([u], length(u)), data),
groupvar:map(lambda([u],
apply("+",u-u)/(length(u)-1)), gqm),
MQA:apply("+",groupmean-globalmean \( )^{\wedge} 2 \cdot( \) groups \( \left.N)\right) \),
MQR:apply("+",(groupsN-1)·groupsvar)/(apply("+",groupsN)-length(data)),
print("global mean:",globalmean, "groups:",groups),
print ("groups mean:",groupmean),
print ("groups var:",groupvar),
print ("MQA:", MQA),
print ("MQR:",MQR)
F:MQA/ MQR
);

Und er zeigt mir das an:
Incorrect syntax: groups is not an infix operator
groups:
^
incorrect syntax: Too many )‘s
almean)^2*(groupsN))
^
incorrect syntax: F is not an infix operator
^
Incorrect syntax: Illegal use of delimiter)
)
^

Also ich hab das neu einkopiert geht.

Deine Code-Copy hat Zeilenumbrüche, wo keine sein sollten und Kommata als Zeilenabschluss fehlen...

Habe es jetzt auch kopiert und eingefügt, klappt. Habe es jetzt noch etwas angepasst und nach deren Beispiel gemacht.

Allerdings weiß ich nicht was groups var: bewirken soll und SSE, Teststatistik T, Ablehnungsbereich werden nicht angezeigt.

Habe es jetzt so aufgeschrieben:


(\%i18) anova \( ( \) data, a) :=block
[dta:flatten(data)],
globalmean:apply("+",dta)/length(dta),
groups:length(data),
groupmean:map(lambda([u], apply("+",u)/length(u)),data),
gqm:data-groupmean,
groupsN:map(lambda([u], length \( (u)) \), data),
groupvar:map(lambda([u], apply("+",u·u)/(length \( (u)-1)), g q m) \),
MQA:apply("+",(groupmean-globalmean)^2·groupsN),
MQR:apply("+",(groupsN-1)-groupvar)/(apply("+",groups N)-length(data)),
print("Globales arithmetisches Mittel: "globalmean),
print( "Arithmetisches Mittel innerhalb von ",groups, "Gruppen:",groupmean),
print("groups var:", groupvar),
print("SST: ",MQA),
print ("MQR: ", MQR),
F:MQAV MQR
I\$;



Und es kommt das raus:


anova(data, 0.05);
Globales arithmetisches Mittel: 4.321875000000001
Arithmetisches Mittel innerhalb von 4 Gruppen: [5.214285714285714,5.344444444444445,4.324999999999999, 2.3875]
groups var: [1.1280952380952383,3.18277777777777775,2.3992857142857145,1.2098214285714288]
SST: 44.920143849206355
MQR: 2.053376558956916
21.876232906849342

wenn du bei MQR den Divisor weglässt kommt Dein SST raus, warum hab ich noch nicht untersucht und über quantil_f erhält man auch ein entsprechendes Ergebnis...

hab den fehler gefunden, bei MQA fehlt der Divisor - hab ich übersehen.

wenn du die zwischen ergebnisse

>SSE, bzw. die Residualvarianz;
SST, bzw. die totale Varianz;<

haben willst, musst du die divisionen bei MQA und MQR auf die Berchnung von F verschieben, dann erhalte ich die ergebnisse aus dem 1. Screenshot.

hast du die auswertung der F-verteilung ergänzt?

global mean: 4.321875000000001 groups:4
groups mean: [5.214285714285714,5.344444444444445,4.324999999999999,2.3875]
groups var: [1.128095238095238,3.182777777777778,2.399285714285715,1.209821428571429
]
SQA: 44.92014384920636
SQR: 57.49454365079365
Teststatik: F 7.292077635616447> Q 2.946685263971055
Nullhypothese abgelehnt => Mittelwerte sind signifikant unterschiedlich bei a=0.05
p-Wert (Wahrsch. > F) 8.5966038583717985*10^-4

Ich bin ehrlich, ich habe keine Ahnung wie man die Auswertung der F-Verteilung ergänzt

Ich stelle oben im Post meine aktuelle Version ein!

Da sind noch ein paar nicht verwendete Werte berechnet, die ich zum Abgleich mit meiner GeoGebra-Version benötigt habe...

Super, klappt alles. Habe jetzt noch die Beschriftungen angepasst, wie es aus der Aufgabe gefordert ist. Vielen Dank!!

wxMaxima ist grafisch eine Wüste - jedenfalls mit gnuplott. Wie es mit den VTK interface auskommt hab ich noch nicht untersucht - da kommt GeoGebra optisch besser - siehe kollateralschaden

blob.png

BTW: Was ist das unter Ansatz in 2.Aufgabe für ein Output?

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Mathelounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community