Normalverteilungskurve in Histogramm einzeichnen

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von jogo »

Hallo N00b,

Code: Alles auswählen

curve(dnorm(x, mean = mean(x4), sd = sd(x4)), add=TRUE, col="red")
Allerdings hast Du vorher in Deinem Histogramm absolute Häufigkeiten dargestellt
- da können die Werte von dnorm() in der Größenordnung nicht mithalten.

Wahrscheinlich willst Du sowas:

Code: Alles auswählen

x4 <- rbinom(10000,100,0.78)
hist(x=x4, main=expression(paste("Bernoulli Random Variables with\n",size,"=1 and", prob,"=0.78")), 
     sub="Standardized Value of Sample Average", xlab = "n=100", ylab = "Probability", probability = TRUE)
curve(dnorm(x, mean = mean(x4), sd = sd(x4)), add=TRUE, col="red")
Gruß, Jörg
N00b
Beiträge: 16
Registriert: Di Dez 01, 2020 2:14 pm

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von N00b »

Guten Morgen Jörg! Danke für deine Antwort :)

Ja und nein. Während es bei einem hohen Wert für N jetzt ganz gut aussieht, "dümpelt" die Normalverteilungskurve bei kleinen Werten für N ziemlich vor sich hin... also bei N=2, N=5... N=25 geht schon wieder.
Ich habe auch versucht R zu überlisten, indem ich "einfach" curve(dnorm(x, mean = mean(x4), sd = sd(x4)), add=TRUE, col="red") auch für die kleinen N eingebe, weil die Normalverteilungskurve bei N=100 in x4 ja funktioniert. Darum dachte ich, wenn ich die x4, also den Bezug, bestehen lasse, dass er mir dann immer dieselbe Kurve zeichnet... denkste... eingesetzt in die anderen Formeln bleibt die Linie flach an der X-Achse.

Gibt es keine Möglich, unabhängig von der zu plottenden Formel einfach jedes Mal, bei jeder Graphik eine Standard Normalverteilungskurve anzeigen zu lassen?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von bigben »

Gibt es Beispielcode mit einer Erklärung, was Dir bei niedrigen N nicht passt?
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von EDi »


Gibt es keine Möglich, unabhängig von der zu plottenden Formel einfach jedes Mal, bei jeder Graphik eine Standard Normalverteilungskurve anzeigen zu lassen?
Klar, schreib dir einfach eine Funktion dafür.

Input ist ein Vektor, output ist der Plot. Das hilft vielleicht auch um das Problem zu lösen...
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.
N00b
Beiträge: 16
Registriert: Di Dez 01, 2020 2:14 pm

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von N00b »

bigben hat geschrieben: Di Jan 05, 2021 12:21 pm Gibt es Beispielcode mit einer Erklärung, was Dir bei niedrigen N nicht passt?
Nunja, ich hab jetzt einfach simultan den Code von @Jogo kopiert und die x-Werte ergänzt. Sieht dann wie folgt aus:

Code: Alles auswählen

x1 <- rbinom(10000,2,0.78)
hist(x=x1, main=expression(paste("Bernoulli Random Variables with\n", size,"=1 and", prob,"=0.78")), 
     sub="Standardized Value of Sample Average", xlab = "n=2", ylab = "Probability", probability = TRUE)
curve(dnorm(x, mean = mean(x1), sd = sd(x1)), add=TRUE, col="red")
x2 <- rbinom(10000,5,0.78)
hist(x=x2, main=expression(paste("Bernoulli Random Variables with\n",size,"=1 and", prob,"=0.78")), 
     sub="Standardized Value of Sample Average", xlab = "n=5", ylab = "Probability", probability = TRUE)
curve(dnorm(x, mean = mean(x2), sd = sd(x2)), add=TRUE, col="red")
x3 <- rbinom(10000,25,0.78)
hist(x=x3, main=expression(paste("Bernoulli Random Variables with\n",size,"=1 and", prob,"=0.78")), 
     sub="Standardized Value of Sample Average", xlab = "n=25", ylab = "Probability", probability = TRUE)
curve(dnorm(x, mean = mean(x3), sd = sd(x3)), add=TRUE, col="red")
x4 <- rbinom(10000,100,0.78)
hist(x=x4, main=expression(paste("Bernoulli Random Variables with\n",size,"=1 and", prob,"=0.78")), 
     sub="Standardized Value of Sample Average", xlab = "n=100", ylab = "Probability", probability = TRUE)
curve(dnorm(x, mean = mean(x4), sd = sd(x4)), add=TRUE, col="red")
EDi hat geschrieben: Di Jan 05, 2021 3:55 pm Klar, schreib dir einfach eine Funktion dafür.
Input ist ein Vektor, output ist der Plot. Das hilft vielleicht auch um das Problem zu lösen...
Ganz ehrlich, ich bin froh das ich es überhaupt irgendwie schaffe die von R bereitgestellten Funktionen zu nutzen... an eigenes Funktionen schreiben kann ich da gar nicht denken. Ich bin kein ITler.
Zuletzt geändert von jogo am Di Jan 05, 2021 5:08 pm, insgesamt 1-mal geändert.
Grund: Formatierung verbessert, siehe http://forum.r-statistik.de/viewtopic.php?f=20&t=29
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von bigben »

Hallo N00b,

IT'ler bin ich auch nicht und Du wirst sehen, Funktionen schreiben in R ist so einfach, dass auch wir nicht-IT'ler das lernen können. Ist jetzt aber gerade nicht das Thema. Wenn ich es richtig verstanden habe, gefällt es Dir ästhetisch nicht, dass bei x1 die Kurve so niedrig verläuft und deshalb nicht glockenförmig aussieht. Vielleicht hilft es dafür herauszoomen:

Code: Alles auswählen

set.seed(1)
x1 <- rbinom(10000,2,0.78)
par(mfrow=c(2,1))
hist(x=x1, probability = TRUE, main = "nah dran")
curve(dnorm(x, mean = mean(x1), sd = sd(x1)), add=TRUE, col="red")
hist(x=x1, probability = TRUE, main = "weiter weg", xlim = c(-2,5))
curve(dnorm(x, mean = mean(x1), sd = sd(x1)), add=TRUE, col="red")
Mit etwas mehr Abstand (x-Skala reicht in beide Richtungen weiter) wird schnell klar, dass die Kurve glockenförmig ist; aber sie muss flacher werden, je breiter sie wird und sie wird hier sehr breit, weil die vom Histogramm gezeigte Verteilung einfach wirklich nicht zu einer Normalverteilung passt. Das ist aber doch genau der Sinn, wenn man eine Normalverteilung über ein Histogramm legt, dass man sehen kann, ob die Verteilung einer Normalverteilung ähnlich ist. In dem Sinne: It's not a bug, it's a feature.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
N00b
Beiträge: 16
Registriert: Di Dez 01, 2020 2:14 pm

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von N00b »

Guten Morgen und danke für die Antwort :)

Ich weiß nicht, vielleicht drücke ich mich auch missverständlich aus. Was ich meine, ist eine Gauß Kurve, das ist doch die Normalverteilungskurve.
Wir sollen das angehängte Bild replizieren. Das scheitert bei mir aber eben gerade noch an der eingezeichneten Kurve.

An und für sich hab ich den Sinn und Zweck ja verstanden, dass die Kurve flacher wird je breiter die Verteilung ist. Aber darum geht es ja, ich möchte das die Kurve UNABHÄNGIG von der Breite der Verteilung ist.

Ich weiß die Hilfe hier im Forum wirklich zu schätzen!
Dateianhänge
Screenshot 2021-01-06 09.08.04.png
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Normalverteilungskurve in Histogramm einzeichnen

Beitrag von bigben »

N00b hat geschrieben: Mi Jan 06, 2021 9:13 am Was ich meine, ist eine Gauß Kurve, das ist doch die Normalverteilungskurve.
Ja, aber es gibt viele Normalverteilungskurven. Eine davon ist die Standardnormalverteilungskurve.
Wir sollen das angehängte Bild replizieren.
Ach so, es gilt hier eine bestimmte Aufgabe zu lösen aber Du verrätst uns nur schrittweise Teile der Aufgabenstellung, erstmal nichts und jetzt ein Bild und auf Nachfrage vielleicht noch den Text zum Bild oder die Daten für die Histogramme?
Aber darum geht es ja, ich möchte das die Kurve UNABHÄNGIG von der Breite der Verteilung ist.
Aha.

Vielleicht hilft Dir eine für Dich maßgeschneiderte Funktionsdefinition. Ich nenne die Funktion "glocke":

Code: Alles auswählen

glocke <- function(size = 1, ...) curve(size/dnorm(0)*dnorm(x), add = TRUE, ...)
Damit kannst Du Histogrammen Glockenkurven hinzufügen, die immer von der Standardnormalverteilungskurve abgeleitet sind, deren Höhe Du aber über das Argument size einstellen kannst, wie Du willst:

Code: Alles auswählen

hist(c(-2.5, -2.5, -2.5, -1, -1, -1, -1, -1, -1, -1, -1, rep(.7, 30)), xlim=c(-3, 3), freq = FALSE, main = "", xlab = "x")
glocke()
glocke(size = 1.25, col = "red")
glocke(size = 0.75, col = "blue") 
glocke(size = 0.5, col = "orange") 
glocke(size = 0.25, col = "pink", lwd = 2)
Es gibt aber nur einen size-Wert, mit dem das eine Verteilungskurve ist.

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten