Zufalls-Samples ziehen aus Gleichverteilung

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

Moderatoren: EDi, jogo

Antworten
data_sky
Beiträge: 13
Registriert: Mo Sep 23, 2019 3:01 pm

Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von data_sky »

Hallo liebes R-Forum,

würd eure Hilfe brauchen.

Folgende Aufgabenstellung:
"Conduct a simulation where you randomly sample from a uniform distribution. Create a vector with the means of random samples coming from a uniform distribution. Let's run a simulation for differen sample sizes: n=40, n=400 and n=4000. Calculate the mean and standard deviation of sample means for each sample size. Finnaly, plot the distribution of the sample means for each sample size.

Are the results corresponding to any of the large sample theorems? If yes, which one? Interpret the plots".

So weit so gut.... Ich wäre so vorgegangen:

Code: Alles auswählen

# sample size n=40
sims <- 1000
n <- 40
sim_means <- rep(NA, sims)

for (i in 1:sims) {
  sim_sample <- runif(n)
  sim_means[i] <- mean(sim_sample)
}

MeanOfSampleMeans <- mean(sim_means)
SdOfSampleMeans <- sd(sim_means)

PlotOfSampleMeans <- plot(density(sim_means))

###############################################

# Sample size n= 400
n2 <- 400
sim_means2 <- rep(NA, sims)
for (i in 1:sims) {
  sim_sample2 <- runif(n2)
  sim_means2[i] <- mean(sim_sample2)
}

MeanOfSampleMeans2 <- mean(sim_means2)
SdOfSampleMeans2 <- sd(sim_means2)

PlotOfSampleMeans2 <- plot(density(sim_means2))

###############################################

#sample size n=4000
n3 <- 4000
sim_means3 <- rep(NA, sims)
for (i in 1:sims) {
  sim_sample3 <- runif(n)
  sim_means3[i] <- mean(sim_sample3)
}

MeanOfSampleMeans3 <- mean(sim_means3)
SdOfSampleMeans3 <- sd(sim_means3)

PlotOfSampleMeans3 <- plot(density(sim_means3))
Was sag ihr dazu?
ruedi_br
Beiträge: 159
Registriert: Do Mär 01, 2018 3:53 pm

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von ruedi_br »

In der Aufgabe steht nichts von 1000facher Wiederholung !?!?
Ansonsten wird in Teil 3 voraussichtlich ein unerwartetes Ergebnis herauskommen, weil dort die Variable n3 nicht verwendet wird ...
Grüße
Ruedi
fortune(111)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von bigben »

Hallo,

das hast Du ganz ordentlich gelöst, da gibt es (außer dem von ruedi aufgezeigten kleinen Fehler), nicht viel zu meckern.

Ich halte die Formulierung

Code: Alles auswählen

rep(NA, 100)
nicht für so besonders klug, denn R weiß ja nicht, ob es Platz für 100 Strings, für 100 Integers, für 100 logische Werte oder für 1000numerische Werte reservieren soll. Daher würde ich lieber

Code: Alles auswählen

numeric(100)
schreiben, oder, und das ist das, was Du meinstest:

Code: Alles auswählen

rep(NA_real_, 1000)
.

Eine for-Schleife ist sicher nicht der eleganteste und wahrscheinlich auch nicht der schnellste Weg, das zu lösen, aber bei den hier vorkommenden Zahlen spricht gar nichts gegen die for-Schleife. Wenn Du aber noch etwas lernen/üben möchtest, könntest Du Dir überlegen, wie man das mit der Funktion replicate() lösen könnte.

Zuletzt erkennt man aus dem von ruedi gefundenen Fehler, dass Du zuviel mit copy&paste programmiert hast. Besser wäre es, eine einzige Funktion zu schreiben, die man einmal mit n = 400, einmal mit n = 400 und einmal mit n = 4000 aufrufen kann. Sicher etwas komplizierter, aber auch kein Hexenwerk.

Der nächste Schritt wäre es, eine schöne Gesamtschau der Befunde zu erstellen, beispielsweise

Code: Alles auswählen

plot(density(sim_means), xlim = c(.35, .65), ylim=c(0,100))
lines(density(sim_means2), add=TRUE, col=2)
lines(density(sim_means3), add=TRUE, col=3)
oder

Code: Alles auswählen

par(mfrow=c(3,1), mar=c(3,2,2,2))
hist(sim_means, xlim = c(.35, .65))
hist(sim_means2, xlim = c(.35, .65))
hist(sim_means3, xlim = c(.35, .65))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
data_sky
Beiträge: 13
Registriert: Mo Sep 23, 2019 3:01 pm

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von data_sky »

ruedi_br hat geschrieben: Do Nov 14, 2019 4:11 pm In der Aufgabe steht nichts von 1000facher Wiederholung !?!?
Ansonsten wird in Teil 3 voraussichtlich ein unerwartetes Ergebnis herauskommen, weil dort die Variable n3 nicht verwendet wird ...
Grüße
Ruedi
Hi Ruedi,

ja das stimmt. Der Prof hat diesen ersten Schritt schon vorweggenommen. Hab' ich vergessen dazu zu schreiben.... Vll steht er einfach nur so auf die Zahl 1000 :P Oder fällt dir ein besonderer Grund dafür ein?

Achja stimmt... Danke werd das gleich ausbessern!
data_sky
Beiträge: 13
Registriert: Mo Sep 23, 2019 3:01 pm

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von data_sky »

Danke erstmal für das Feedback!
bigben hat geschrieben: Do Nov 14, 2019 4:30 pm Hallo,

das hast Du ganz ordentlich gelöst, da gibt es (außer dem von ruedi aufgezeigten kleinen Fehler), nicht viel zu meckern.

Ich halte die Formulierung

Code: Alles auswählen

rep(NA, 100)
nicht für so besonders klug, denn R weiß ja nicht, ob es Platz für 100 Strings, für 100 Integers, für 100 logische Werte oder für 1000numerische Werte reservieren soll. Daher würde ich lieber

Code: Alles auswählen

numeric(100)
schreiben, oder, und das ist das, was Du meinstest:

Code: Alles auswählen

rep(NA_real_, 1000)
.
Guter Einwand! Danke, werd ich so machen.
bigben hat geschrieben: Do Nov 14, 2019 4:30 pmEine for-Schleife ist sicher nicht der eleganteste und wahrscheinlich auch nicht der schnellste Weg, das zu lösen, aber bei den hier vorkommenden Zahlen spricht gar nichts gegen die for-Schleife. Wenn Du aber noch etwas lernen/üben möchtest, könntest Du Dir überlegen, wie man das mit der Funktion replicate() lösen könnte.
Hm... ja klingt interessant. Werd ich mir mal anschauen und meinen Versuch wieder hier posten, wenn das passt.
bigben hat geschrieben: Do Nov 14, 2019 4:30 pmDer nächste Schritt wäre es, eine schöne Gesamtschau der Befunde zu erstellen, beispielsweise

Code: Alles auswählen

plot(density(sim_means), xlim = c(.35, .65), ylim=c(0,100))
lines(density(sim_means2), add=TRUE, col=2)
lines(density(sim_means3), add=TRUE, col=3)
oder

Code: Alles auswählen

par(mfrow=c(3,1), mar=c(3,2,2,2))
hist(sim_means, xlim = c(.35, .65))
hist(sim_means2, xlim = c(.35, .65))
hist(sim_means3, xlim = c(.35, .65))
LG,
Bernhard
Hey gute Idee! Das werd ich dir klauen 8)


Noch zur letzten Aufgabe, der Interpretation: könnt ihr mir hier vielleicht auch noch einen kleinen Denkanstoß geben?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von bigben »

Das mit der 1000 fällt halt auf, weil beim Lesen der Aufgabe die Zahl der Wiederholungen fehlt. Ist aber kein Problem, wenn man sie weiß.
Werd ich mir mal anschauen und meinen Versuch wieder hier posten, wenn das passt.
Versuch es mal selbst zu lösen, wenn Du spicken willst, hätte ich hier eine Lösung in 7 Zeilen für Dich:

Code: Alles auswählen

simulate <- function(n){
  means <- replicate(1000, mean(runif(n)))
  plot(density(means), xlab=c(.2, .8), main=paste("n = ", n))
  return(list(mean_of_means = mean(means), sd_of_means = sd(means)))
}

for(n in c(40, 400, 4000))
  print(list(n=n, results = simulate(n)))
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
data_sky
Beiträge: 13
Registriert: Mo Sep 23, 2019 3:01 pm

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von data_sky »

bigben hat geschrieben: Do Nov 14, 2019 4:49 pm Das mit der 1000 fällt halt auf, weil beim Lesen der Aufgabe die Zahl der Wiederholungen fehlt. Ist aber kein Problem, wenn man sie weiß.

Zum letzten Teil: Fällt Dir nicht irgendein ganz Zentraler Satz zum Grenzwert von Mittelwerten von Verteilungen ein?
Werd ich mir mal anschauen und meinen Versuch wieder hier posten, wenn das passt.
Versuch es mal selbst zu lösen, wenn Du spicken willst, hätte ich hier eine Lösung in 7 Zeilen für Dich:

Code: Alles auswählen

simulate <- function(n){
  means <- replicate(1000, mean(runif(n)))
  plot(density(means), xlab=c(.2, .8), main=paste("n = ", n))
  return(list(mean_of_means = mean(means), sd_of_means = sd(means)))
}

for(n in c(40, 400, 4000))
  print(list(n=n, results = simulate(n)))
Haha, danke für den dezenten Hinweis. Es ist mir grad selbst aufgefallen, alls ich die drei Plots übereinanderlegte und mir dachte: hey Moment! Das kenn ich doch woher :D
data_sky
Beiträge: 13
Registriert: Mo Sep 23, 2019 3:01 pm

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von data_sky »

Ich hab als Interpretation jetzt das hingeschrieben. Sollte eigentlich formal passen, oder gibt's dran was auszusetzen?

Code: Alles auswählen

# Combining the three densitiy-functions of the sample means in one plot shows us, the larger the
# sample size, the more the densitiy function of the sample means converges towards the density function
# of a normal distribution. This is the so called "central limit theorem (CLM)".
Noch eine Frage: Ist das Gesetz großer Zahlen in diesem Fall nicht auch von Relevanz?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zufalls-Samples ziehen aus Gleichverteilung

Beitrag von bigben »

Doch, natürlich: Je größer die Stichprobe umso präziser die Mittelwertschätzung.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten