Seite 1 von 1

Zufallsvariablen generieren

Verfasst: Mo Jun 22, 2020 5:15 pm
von xImLost
Guten Nachmittag,
wie kann man bei einem gegebenen n eine Zufallsvariable der Standardnormalverteilung bzw Gleichverteilung (bei letzterem von -1 bis 1) generieren ?

Standardnormalverteilung habe ich glaub ich gefunden und sollte ja pnorm(n) sein oder ? Wenn ja wie kann ich nun zeigen oder sehen, wie viele Werte/Daten in einem bestimmten Intervall liegen? Ich hab noch wenig Ahnung von R, aber in Java hätte ich jetzt die Werte in einem Array gespeichert und würde einfach durchs Array mithilfe einer for Schleife iterieren und mit einer if Schleife prüfen, ob die zahl an der i.ten Position innerhalb des Intervalls liegt. Ist sowas mit R auch möglich oder gibt es einen anderen Weg für mein Problem?

Re: Zufallsvariablen generieren

Verfasst: Mo Jun 22, 2020 5:54 pm
von EDi
?rnorm
?runif



?cut zum zerschnippseln in Intervalle, ?table zum Zählen der Schnippsel.

Re: Zufallsvariablen generieren

Verfasst: Mo Jun 22, 2020 7:20 pm
von bigben
xImLost hat geschrieben: Mo Jun 22, 2020 5:15 pmwie kann man bei einem gegebenen n eine Zufallsvariable der Standardnormalverteilung bzw Gleichverteilung (bei letzterem von -1 bis 1) generieren ?
Hat EDi schon beantwortet
sollte ja pnorm(n) sein oder ?


Du musst unterscheiden zwischen rnorm, dnorm, pnorm und qnorm. rnorm macht Zufallszahlen, die drei anderen erklären sich am besten, wenn Du der Reihe nach diese drei plots in Ruhe anschaust:

Code: Alles auswählen

curve(dnorm(x),from = -4, to = 4)
curve(pnorm(x),from = -4, to = 4)
curve(qnorm(x),from = 0, to = 1)

Wenn ja wie kann ich nun zeigen oder sehen, wie viele Werte/Daten in einem bestimmten Intervall liegen? Ich hab noch wenig Ahnung von R, aber in Java hätte ich jetzt die Werte in einem Array gespeichert und würde einfach durchs Array mithilfe einer for Schleife iterieren und mit einer if Schleife prüfen, ob die zahl an der i.ten Position innerhalb des Intervalls liegt.

Ich habe noch nicht genau verstanden, welches Problem Du damit lösen willst. Kannst Du das bitte nochmal erklären? Wieviele Daten in einem Intervall der Standardnormalverteilung liegen würde ich mit pnorm berechnen, nicht mit rnorm simulieren -- es sei denn natürlich, das Simulieren sei die eigentlich gestellte Aufgabe.
Ist sowas mit R auch möglich oder gibt es einen anderen Weg für mein Problem?
Im Zweifel geht das eleganter als mit einer for-Schleife, wir sind ja nicht in Java.


LG,
Bernhard

Re: Zufallsvariablen generieren

Verfasst: Di Jun 23, 2020 5:35 pm
von xImLost
Ich bin ein bisschen verwirrt gerade. Die deutschen Bezeichner kenne ich eigentlich und kann ich auch unterscheiden, aber das mit R und meinen Aufgaben find ich komisch.
In der einen sollte ich eine Zufallsstichprobe vom Umfang 241 mit EW 9 und Varianz 2 simulieren. Dafür habe ich dann die eben besagte Funktion :

Code: Alles auswählen

rnorm(241, mean=9, sd=sqrt(2)
verwendet? Wurzel 2 weil die Funktion ja die Standardabweichung als Parameter hat und die Varianz die quadratische SA ist. Passt das oder hab ich mich wieder in der Funktion vertan?

Aber die eigentlichen 2 Aufgaben, die ich mit meinem Post ansprechen wollte :

Ich soll 941 Zufallsvariablen der Standardnormalverteilung generieren und zeigen wie viele Zahlen im Intervall -1,96 bis 1,96 befinden.
Ersteres wäre ja dann einfach

Code: Alles auswählen

rnorm(941) 
aber wie würde ich zeigen, wie viele davon im Intervall liegen ?

Edit: Ich glaube das wurde oben schon beantwortet. Also mit cut und table? Dachte mir schon, dass meine idee mit der for schleife nicht der schönste Weg ist. Wäre das dann table(cut(x, breaks= -1.96:1.96) ?

Zweite Aufgabe ist das Generieren von n Zufallsvariablen der Gleichverteilung von -1 bis 1. Im anschluss soll die Summary Funktion auf alle positiven Zahlen angewandt werden. Das läuft dann also über runif und apply ab oder ?
Edit :

Code: Alles auswählen

z3 =runif(993,-1,1) 
number = sum(z3[z3>0]) 
Müsste so sein i guess ?

Danke im Voraus

Re: Zufallsvariablen generieren

Verfasst: Di Jun 23, 2020 10:42 pm
von xImLost
Hallo,

also falls mir noch wer helfen könnte, wäre es ultra lieb. Wie würde die 2. Aufgabe mit cut und table aussehen oder allgemein schön?
Meine Lösung sollte auch legitim sein, aber sie ist halt hässlich :

Code: Alles auswählen

z2 = rnorm(941)
z2.1= z2[z2>-1.96 & z2<1.96]
lenght = length(z2.1)
Das müsste es doch in der Theorie tun oder täusch ich mich? Könnte mir den zwischenschritt auch sparren und direkt die Länge berechnen, aber wollte sehen, dass es das tut, was ich will

Re: Zufallsvariablen generieren

Verfasst: Mi Jun 24, 2020 7:04 am
von bigben
Ich finde die hässliche Lösung so hässlich gar nicht. Was mir nicht passt: lenght ist ein Schreibfehler und length ist schon der Name einer Funktion. Zwar kann R das ganz gut ab, wenn eine Wertevariable und eine Funktion den gleichen Bezeichner tragen, aber wenn Du mal was falsch machst ist das ein Rezept für wirklich blöde Fehlermeldungen.

Ich würde es so umformulieren und das Simulationsergebnis mit der berechneten "exakten" Lösung vergleichen:

Code: Alles auswählen

z2 = rnorm(941)
z2.1= z2[z2 > -1.96 & z2 < 1.96]
l = length(z2.1)
share = l / 941
print(share)

print(pnorm(1.96) - pnorm(-1.96))
Wenn die Simulation etwas komplizierter wird, würde ich tendenziell noch ein set.seed vorneweg schreiben, um reproduzierbare Ergebnisse zu haben, über die man dann auch z. B. in einem Forum sprechen kann.

Eine dem sehr ähnliche Variante wäre es, einen Vektor mit Logikwerten zu füllen. Mit so etwas lässt sich in R später sehr gut indizieren:

Code: Alles auswählen

z2 = rnorm(941)
z2.logic = z2>-1.96 & z2<1.96
head(z2.logic)
l = sum(z2.logic)
share = l/941
print(share)
LG,
Bernhard