Câu hỏi Lắp một đường cong mật độ vào một biểu đồ trong R


Có một hàm trong R phù hợp với đường cong với biểu đồ không?

Giả sử bạn có biểu đồ sau

hist(c(rep(65, times=5), rep(25, times=5), rep(35, times=10), rep(45, times=4)))

Có vẻ bình thường, nhưng nó bị lệch. Tôi muốn phù hợp với một đường cong bình thường bị lệch xung quanh biểu đồ này.

Câu hỏi này khá cơ bản, nhưng dường như tôi không thể tìm ra câu trả lời cho R trên internet.


76
2017-09-30 11:23


gốc


Bạn có muốn tìm m và s sao cho phân bố Gaussian N (m, s) phù hợp với dữ liệu của bạn không? - SteinNorheim
Tôi không chắc điều đó có nghĩa là gì ...> _> - user5243421
@mathee: Tôi nghĩ anh ấy có nghĩa là m = mean, và s = ​​độ lệch chuẩn. Gaussian phân phối là một tên khác cho phân phối bình thường. - Peter Mortensen


Các câu trả lời:


Nếu tôi hiểu câu hỏi của bạn một cách chính xác, thì bạn có thể muốn ước tính mật độ cùng với biểu đồ:

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

Chỉnh sửa một thời gian dài sau:

Đây là một phiên bản mặc quần áo hơi hơn:

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) 

cùng với biểu đồ nó tạo ra:

enter image description here


138
2017-09-30 12:02



+1 - bạn cũng có thể làm điều đó theo cách khác, tức là điều chỉnh cốt truyện mật độ để phù hợp với biểu đồ không? - vonjd
Tôi đề nghị đưa tham số bổ sung cho lines(density(X,na.rm= TRUE) vì vectơ có thể chứa các giá trị NA. - Anirudh


Điều đó thật dễ dàng với 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()

hoặc bắt chước kết quả từ giải pháp Dirk

ggplot(dataset, aes(x = X)) + 
  geom_histogram(aes(y = ..density..), binwidth = 5) + 
  geom_density()

25
2017-09-30 18:30





Đây là cách tôi làm điều đó:

foo <- rnorm(100, mean=1, sd=2)
hist(foo, prob=TRUE)
curve(dnorm(x, mean=mean(foo), sd=sd(foo)), add=TRUE)

Một bài tập tiền thưởng là để làm điều này với gói ggplot2 ...


24
2017-09-30 13:32



Tuy nhiên, nếu bạn muốn thứ gì đó bị lệch, bạn có thể làm ví dụ về mật độ từ trên, chuyển đổi dữ liệu của bạn (ví dụ: foo.log & lt; - log (foo) và thử ở trên) hoặc thử lắp một bản phân phối bị lệch, chẳng hạn như các gamma hoặc lognormal (lognormal tương đương với việc đăng nhập và lắp một bình thường, btw). - John Johnson
Nhưng điều đó vẫn yêu cầu ước tính các thông số phân phối của bạn trước tiên. - Dirk Eddelbuettel
Điều này nhận được một chút xa xôi từ chỉ đơn giản là thảo luận về R, khi chúng tôi đang nhận được nhiều hơn vào thống kê lý thuyết, nhưng bạn có thể thử liên kết này cho Gamma: en.wikipedia.org/wiki/Gamma_distribution#Parameter_estimation  Đối với lognormal, chỉ cần đăng nhập (giả sử tất cả dữ liệu là dương) và làm việc với dữ liệu log-transform. Đối với bất cứ điều gì fancier, tôi nghĩ rằng bạn sẽ phải làm việc với một cuốn sách giáo khoa thống kê. - John Johnson
Tôi nghĩ bạn hiểu nhầm cả áp phích gốc cũng như tất cả các câu trả lời khác là khá nội dung để sử dụng ước tính không tham số - như biểu đồ trường học cũ hoặc ước tính kiểm duyệt dữ liệu hiện đại hơn một chút. Ước tính tham số là tuyệt vời nếu bạn có lý do chính đáng để nghi ngờ phân phối. Nhưng đó không phải là trường hợp ở đây. - Dirk Eddelbuettel


Dirk đã giải thích cách vẽ hàm mật độ trên biểu đồ. Nhưng đôi khi bạn có thể muốn đi với giả định mạnh mẽ hơn của một phân phối bình thường sai lệch và cốt truyện thay vì mật độ. Bạn có thể ước tính các thông số của phân phối và vẽ nó bằng cách sử dụng sn gói:

> 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 

Skew-normal distributed data plot

Điều này có thể hoạt động tốt hơn trên dữ liệu trở nên bình thường hơn:

Another skew-normal plot


11
2018-02-13 07:10





Tôi đã có cùng một vấn đề nhưng giải pháp của Dirk dường như không hoạt động. Tôi đã nhận được thông báo cảnh báo này mỗi lần

"prob" is not a graphical parameter

Tôi đọc qua lịch sử và tìm thấy freq: một bộ vector lôgic TRUE theo mặc định.

mã làm việc cho tôi là

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)

1
2018-01-21 14:34