Apakah ada fungsi di R yang menyesuaikan kurva dengan histogram?
Katakanlah Anda memiliki histogram berikut
hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))
Kelihatannya normal, tapi miring. Saya ingin menyesuaikan kurva normal yang miring untuk membungkus histogram ini.
Pertanyaan ini agak mendasar, tetapi sepertinya saya tidak dapat menemukan jawaban untuk R di internet.
r
histogram
curve-fitting
r-faq
pengguna5243421
sumber
sumber
Jawaban:
Jika saya memahami pertanyaan Anda dengan benar, maka Anda mungkin menginginkan perkiraan kepadatan bersama dengan histogram:
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
Edit lama nanti:
Ini adalah versi yang sedikit lebih rapi:
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)
bersama dengan grafik yang dihasilkannya:
sumber
lines(density(X,na.rm= TRUE)
karena vektor mungkin berisi nilai NA.Hal seperti itu mudah dilakukan dengan 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()
atau untuk meniru hasil dari solusi Dirk
ggplot(dataset, aes(x = X)) + geom_histogram(aes(y = ..density..), binwidth = 5) + geom_density()
sumber
Inilah cara saya melakukannya:
foo <- rnorm(100, mean=1, sd=2) hist(foo, prob=TRUE) curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)
Latihan bonus adalah melakukan ini dengan paket ggplot2 ...
sumber
Dirk telah menjelaskan cara memplot fungsi kerapatan di atas histogram. Namun terkadang Anda mungkin ingin menggunakan asumsi yang lebih kuat tentang distribusi normal miring dan plot yang bukannya kepadatan. Anda dapat memperkirakan parameter distribusi dan memplotnya menggunakan paket sn :
> 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
Ini mungkin berfungsi lebih baik pada data yang lebih condong-normal:
sumber
Saya memiliki masalah yang sama tetapi solusi Dirk tampaknya tidak berhasil. Saya mendapatkan pesan peringatan ini setiap saat
"prob" is not a graphical parameter
Saya membaca
?hist
dan menemukan tentangfreq: a logical vector set TRUE by default.
kode yang berhasil untuk saya adalah
hist(x,freq=FALSE) lines(density(x),na.rm=TRUE)
sumber