Il montaggio di una curva di densità di un istogramma in R
-
19-09-2019 - |
Domanda
C'è una funzione in R che monta una curva di un istogramma?
Diciamo che ha avuto il seguente istogramma
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Sembra normale, ma è inclinata.Voglio montare un normale curva è inclinata per avvolgere intorno a questo istogramma.
Questa domanda è piuttosto semplice, ma non riesco a trovare la risposta per R su internet.
Soluzione
Se ho capito bene la tua domanda, allora probabilmente vuole una stima della densità con l'istogramma:
X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE) # prob=TRUE for probabilities not counts
lines(density(X)) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted") # add another "smoother" density
Modifica molto tempo dopo:
Ecco una versione leggermente più a vestito:
X <- c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4))
hist(X, prob=TRUE, col="grey")# prob=TRUE for probabilities not counts
lines(density(X), col="blue", lwd=2) # add a density estimate with defaults
lines(density(X, adjust=2), lty="dotted", col="darkgreen", lwd=2)
insieme con il grafico produce:
Altri suggerimenti
cosa del genere è facile con il ggplot2
library(ggplot2)
dataset <- data.frame(X = c(rep(65, times=5), rep(25, times=5),
rep(35, times=10), rep(45, times=4)))
ggplot(dataset, aes(x = X)) +
geom_histogram(aes(y = ..density..)) +
geom_density()
o per simulare il risultato dalla soluzione di Dirk
ggplot(dataset, aes(x = X)) +
geom_histogram(aes(y = ..density..), binwidth = 5) +
geom_density()
Ecco il mio modo di farlo:
foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)
Un esercizio bonus è di farlo con il pacchetto ggplot2 ...
Dirk ha spiegato come tracciare la funzione di densità sopra l'istogramma. Ma a volte si potrebbe desiderare di andare con il più forte assunzione di una distribuzione normale asimmetrica e la trama che invece di densità. È possibile stimare i parametri della distribuzione e tracciare utilizzando il sn pacchetto :
> sn.mle(y=c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
$call
sn.mle(y = c(rep(65, times = 5), rep(25, times = 5), rep(35,
times = 10), rep(45, times = 4)))
$cp
mean s.d. skewness
41.46228 12.47892 0.99527
Questo probabilmente funziona meglio sui dati che è più skew-normale:
Ho avuto lo stesso problema, ma Dirk soluzione non sembra funzionare.Mi è stato sempre questo avviso messege ogni volta
"prob" is not a graphical parameter
Ho letto ?hist
e trovato circa freq: a logical vector set TRUE by default.
il codice che ha funzionato per me è
hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)