Seite 1 von 2

Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Fr Jul 19, 2019 8:48 pm
von Tschaui
Hallo,
ich soll für ein Projekt eine graphische Überprüfung auf Normalverteilung durchführen. Mit einem Quantil-Quantil-Diagramm klappt es irgendwie nicht so gut. Deswegen, und weil ich es optisch schöner finde, wollte ich ein Histogramm mit Normalverteilungskurve erstellen. Dafür habe ich folgende Befehle verwendet:
hist(subset(Datensatz_Projektarbeit$Mittelwert, Datensatz_Projektarbeit$COND == "closeness"), main = "Mittelwert; COND: closeness", xlim = c(1,7))

curve(dnorm(x, mean = mean(subset(Datensatz_Projektarbeit$Mittelwert, Datensatz_Projektarbeit$COND == "closeness")), sd= sd (subset(Datensatz_Projektarbeit$Mittelwert, Datensatz_Projektarbeit$COND == "closeness"))), add=T)
Der Datensatz heißt "Datensatz_Projektarbeit", ich möchte die Normalverteilung der Mittelwerte berechnen (diese haben eine eigen Spalte im Datensatz). Aber ich möchte nur die berücksichtigen, die in der Spalte "COND" die Eigenschaft "closeness" haben. Das Histogramm sieht schon recht überzeugend aus, aber mit der Normalverteilung kann irgendetwas nicht stimmen. Kann mir vielleicht irgendjemand sagen, wo mein Fehler liegen könnte?

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Fr Jul 19, 2019 9:32 pm
von Athomas
Wenn Du die Dichte (die ja die "Fläche" 1 mit der x-Achse einschließt) mit der Anzahl der Beobachtungen (die Fläche des Histograms) multiplizierst, sollte etwas Vernünftiges rauskommen ...

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Fr Jul 19, 2019 11:33 pm
von Tschaui
Vielen dank, das klingt sinnvoll! Wo genau in den „curve-Befehl“ muss ich denn die Multiplikation reinschreiben? Und in welcher Form? Einfach „*n“?

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Sa Jul 20, 2019 8:37 am
von student
Wenn Du in der Histogrammdarstellung auch auf Dichte wechselst (freq = FALSE) müsste das doch direkt klappen!?

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Sa Jul 20, 2019 9:06 am
von Tschaui
Das hat funktioniert, vielen Dank

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Sa Jul 20, 2019 9:51 am
von Tschaui
Jetzt noch eine letzte Frage: Ich habe jetzt folgendes eingegeben:

Code: Alles auswählen

hist(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "closeness"), main = "SIB_BOND; COND: closeness", xlim= c(1,7), xlab = "Wert auf der Skala", ylab = "Anzahl", breaks = seq(1,7, length=7), freq = FALSE)
curve(dnorm (x, mean = mean(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "closeness")), sd= sd (subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "closeness"))), add=T)

hist(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit_$COND == "distance"), main = "SIB_BOND;COND: Distance", xlim= c(1,7), xlab = "Wert auf der Skala", ylab = "Anzahl", breaks = seq(1,7, length=7), freq = FALSE)
curve(dnorm (x, mean = mean(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "distance")), sd= sd (subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "distance"))), add=T)

hist(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "intermediate"), main = "SIB_BOND;COND: intermediate", xlim= c(1,7), xlab = "Wert auf der Skala", ylab = "Anzahl", breaks = seq(1,7, length=7), freq = FALSE)
curve(dnorm (x, mean = mean(subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "intermediate")), sd= sd (subset(Datensatz_Projektarbeit$SIB_BOND, Datensatz_Projektarbeit$COND == "intermediate"))), add=T)
Damit möchte ich jeweils Histogramm und Normalverteilungskurve für die drei Konditionen ("closeness", "intermediate" und "distance") erstellen. Bei dem ersten Histogramm klappt das auch, aber bei den anderen beiden wird mit die Normalverteilungskurve nicht mehr angezeigt... Hat jemand eine Idee, woran das liegen könnte?
so sieht es aus, wenn ich alle Befehle ausgeführt habe
so sieht es aus, wenn ich alle Befehle ausgeführt habe

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: So Jul 21, 2019 9:39 am
von student
Versuch doch mal mit der Grafikfunktion par() zu arbeiten....

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: So Jul 21, 2019 12:37 pm
von Tschaui
Das ändert leider nichts, trotzdem werden mir die letzten beiden Kurven nicht angezeigt.

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Mi Jul 24, 2019 1:25 pm
von bigben
1. Einen offensichtlichen Fehler sehe ich nicht, aber die Codezeilen sind auch recht lang und damit unübersichtlich ausgefallen. Ich vermute, dass sich im zweiten und im dritten subset fehlende Werte (NA) befinden. Wenn das so ist, dann berechnet mean keinen Mittelwert und sd keine Standardabweichung und ohne diese beiden Werte kann curve keine Kurve zeichnen. Bitte poste einen Beispieldatensatz, mit dem wir Deinen Code ausprobieren und das Problem auf unseren Rechnern reproduzieren können.
Zum Beispiel könntest Du das Ergebnis von folgendem posten:

Code: Alles auswählen

dput(Datensatz_Projektarbeit[c("SIB_BOND", "COND")])
2. Bitte schreibe, ob R beim Ausführen Deines Codes irgendwelche Warnungen oder Fehlermeldungen ausgegeben hat.
3. Wenn Du im Aufruf von hist() folgendes setzt: "freq = FALSE" dann darfst Du die y-Achse nachher nicht mehr "Anzahl" nennen.
4. Bitte schreib nie add = T . Wenn Du an irgendeiner anderen Stelle findest, dass der Zeitpunkt Null ist und das mit einem T <- 0 ausdrückst, funktionieren auf einmal Deine Grafiken nicht mehr. Schreib add = True und dieser Fehler kann nicht mehr passieren.
5. Ich rate dringend zur Verwendung von code-Tags. Oben habe ich welche für Dich eingefügt. Siehe auch viewtopic.php?f=20&t=29

LG,
Bernhard

Re: Normalverteilungskurve in Histogramm einzeichnen

Verfasst: Mo Jan 04, 2021 11:19 pm
von N00b
Ich kram jetzt einfach mal das alte Thema hervor bevor ich ein neues aufmache...
Auch ich möchte gerne eine Normalverteilungskurve in meine Histogramme einfügen und habe die Formel mal nach meinen Eingaben umgeschrieben, leider ohne Erfolg... "'expr' muss eine Funktion, ein Aufruf oder ein Ausdruck sein, der 'x' enthält"

Warum einfach wenns auch kompiziert geht? Könnte ja auch mal was auf Anhieb funktionieren ohne das man frägt.
curve(dnorm(x4, mean = mean(x4), sd= sd (x4), add=T) <- abgeleitet von der Formel im Eröffnungspost

Aber hier gibt es zum Glück genug geduldige User die Ahnung von der Thematik haben, darum hier mal mein Code:

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")
curve(dnorm(x4, mean = mean(x4), sd = sd(x4), add=T)