Nối đường cong mật độ với biểu đồ trong R


91

Có hàm nào trong R phù hợp với đường cong của 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)))

Nó trông bình thường, nhưng nó bị lệch. Tôi muốn điều chỉnh một đường cong bình thường bị lệch để quấn quanh biểu đồ này.

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


Bạn có muốn tìm m và s sao cho phân phối 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 ...> _>
user5243421

10
@mathee: Tôi nghĩ anh ấy có nghĩa là m = trung bình, và s = ​​độ lệch chuẩn. Phân phối Gaussian là một tên gọi khác của phân phối chuẩn.
Peter Mortensen 30/09/09

Câu trả lời:


154

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 lúc lâu sau:

Đây là một phiên bản ăn mặc đẹp hơn một chút:

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 đồ mà nó tạo ra:

nhập mô tả hình ảnh ở đây


3
+1 - bạn cũng có thể làm theo cách khác, tức là điều chỉnh biểu đồ mật độ để phù hợp với biểu đồ?
vonjd 14/1113

2
Tôi khuyên bạn nên cung cấp tham số bổ sung lines(density(X,na.rm= TRUE)vì vectơ có thể chứa các giá trị NA.
Anirudh

30

Đ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 của Dirk

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

28

Đâ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 bổ sung là làm điều này với gói ggplot2 ...


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ừ phía trên, chuyển đổi dữ liệu của bạn (ví dụ: foo.log & lt; - log (foo) và thử cách trên) hoặc thử điều chỉnh một phân phối lệch, chẳng hạn như gamma hoặc lognormal (lognormal tương đương với việc lấy nhật ký và khớp một bình thường, btw).
John Johnson

2
Nhưng điều đó vẫn yêu cầu ước tính các tham số của phân phối của bạn trước.
Dirk Eddelbuettel 30/09/09

Điều này hơi xa so với việc đơn giản là thảo luận về R, vì chúng ta đang nghiên cứu sâu hơn về 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 lấy nhật ký (giả sử tất cả dữ liệu là tích cực) và hoạt động với dữ liệu được chuyển đổi nhật ký. Đối với bất cứ điều gì kỳ lạ hơn, tôi nghĩ 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

3
Tôi nghĩ rằng bạn hiểu sai cách cả người đăng ban đầu cũng như tất cả các câu trả lời khác đều khá nội dung khi sử dụng các ước tính phi tham số - như biểu đồ cổ điển hoặc ước tính mật độ theo hướng 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ờ một phân phối. Nhưng đó không phải là trường hợp ở đây.
Dirk Eddelbuettel 30/09/09

11

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 về phân phối chuẩn bị lệch và vẽ biểu đồ đó thay vì mật độ. Bạn có thể ước tính các tham số của phân phối và vẽ biểu đồ bằng cách sử dụng gói 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 

Biểu đồ dữ liệu phân tán bình thường

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

Một âm mưu khác bình thường


3

Tôi đã gặp vấn đề tương tự nhưng giải pháp của Dirk dường như không hoạt động. Tôi luôn nhận được tin nhắn cảnh báo này

"prob" is not a graphical parameter

Tôi đã đọc qua ?histvà tìm thấy vềfreq: a logical vector set TRUE by default.

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

hist(x,freq=FALSE)
lines(density(x),na.rm=TRUE)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.