Zufallsvariablen generieren

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
xImLost
Beiträge: 11
Registriert: Mo Jun 22, 2020 3:23 pm

Zufallsvariablen generieren

Beitrag 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?
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zufallsvariablen generieren

Beitrag von EDi »

?rnorm
?runif



?cut zum zerschnippseln in Intervalle, ?table zum Zählen der Schnippsel.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zufallsvariablen generieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
xImLost
Beiträge: 11
Registriert: Mo Jun 22, 2020 3:23 pm

Re: Zufallsvariablen generieren

Beitrag 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
xImLost
Beiträge: 11
Registriert: Mo Jun 22, 2020 3:23 pm

Re: Zufallsvariablen generieren

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zufallsvariablen generieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten