Các phương pháp tốt cho các ô mật độ của các biến không âm trong R?


36
plot(density(rexp(100))

Rõ ràng tất cả mật độ ở bên trái của số không đại diện cho sự thiên vị.

Tôi đang tìm cách tóm tắt một số dữ liệu cho những người không thống kê và tôi muốn tránh những câu hỏi về lý do tại sao dữ liệu không âm có mật độ ở bên trái của số không. Các lô là để kiểm tra ngẫu nhiên; Tôi muốn hiển thị phân phối các biến theo các nhóm điều trị và kiểm soát. Các bản phân phối thường theo cấp số nhân-ish. Biểu đồ là khó khăn vì nhiều lý do.

Một tìm kiếm nhanh trên google cho tôi công việc của các nhà thống kê về hạt nhân không âm, ví dụ: cái này .

Nhưng có bất kỳ trong số đó đã được thực hiện trong R? Trong số các phương pháp đã thực hiện, có bất kỳ phương pháp nào trong số chúng "tốt nhất" theo một cách nào đó để thống kê mô tả không?

EDIT: ngay cả khi fromlệnh có thể giải quyết vấn đề hiện tại của tôi, thật tuyệt khi biết liệu có ai đã thực hiện hạt nhân dựa trên tài liệu về ước tính mật độ không âm


3
Không phải những gì bạn đang hỏi, nhưng tôi sẽ không áp dụng ước tính mật độ hạt nhân cho thứ gì đó theo cấp số nhân, đặc biệt là để trình bày cho khán giả không thống kê. Tôi sẽ sử dụng một biểu đồ lượng tử - lượng tử và giải thích rằng âm mưu đó phải thẳng nếu phân phối theo cấp số nhân.
Nick Cox

6
plot(density(rexp(100), from=0))?
Stéphane Laurent

4
Một điều mà đôi khi tôi đã thực hiện khá thành công là lấy một kde trên các bản ghi, và sau đó chuyển đổi ước tính mật độ (không quên Jacobian). Một khả năng khác là sử dụng ước tính mật độ log-spline được thiết lập để nó biết về ràng buộc.
Glen_b -Reinstate Monica


1
Tôi đã thảo luận về phương thức chuyển đổi được đề cập bởi @Glen_b trong stata-journal.com/sjpdf.html?articlenum=gr0003 (xem tr.76-78). Số không có thể được cung cấp bằng cách sử dụng nhật ký (x + 1) thay vì ghi nhật ký và sửa đổi Jacobian.
Nick Cox

Câu trả lời:


21

Một giải pháp, được mượn từ các phương pháp tiếp cận trọng số cạnh của thống kê không gian, là cắt bớt mật độ ở bên trái ở mức 0 nhưng để tăng trọng số liệu gần nhất với số không. Ý tưởng là mỗi giá trị được "trải" vào một hạt nhân có tổng diện tích đơn vị tập trung tại x ; bất kỳ phần nào của hạt nhân tràn vào lãnh thổ âm sẽ bị loại bỏ và hạt nhân được tái chuẩn hóa thành đơn vị diện tích.xx

Chẳng hạn, với hạt nhân Gaussian , trọng lượng tái chuẩn hóa làKh(y,x)=exp(12((yx)/h)2)/2π

w(x)=1/0K(y,x)dy=11Φx,h(0)

Trong đó là hàm phân phối tích lũy của phương sai Bình thường của giá trị trung bình x và độ lệch chuẩn h . Công thức so sánh có sẵn cho các hạt nhân khác.Φxh

Điều này đơn giản hơn - và nhanh hơn nhiều trong tính toán - hơn là cố gắng thu hẹp băng thông gần . Dù sao, rất khó để quy định chính xác cách thay đổi băng thông gần 0 . Tuy nhiên, phương pháp này cũng đặc biệt : vẫn sẽ có một số sai lệch gần 0 . Nó xuất hiện để làm việc tốt hơn so với ước tính mật độ mặc định. Dưới đây là so sánh sử dụng bộ dữ liệu lớn:000

Nhân vật

Màu xanh hiển thị mật độ mặc định trong khi màu đỏ hiển thị mật độ được điều chỉnh cho cạnh bằng . Phân phối cơ bản thực sự được truy tìm là một đường chấm chấm để tham khảo.0


Mã R

Các densitychức năng trong Rsẽ phàn nàn rằng tổng trọng lượng không phải là thống nhất, bởi vì nó muốn tích trên tất cả các số thực được thống nhất, trong khi đó phương pháp này làm cho không thể thiếu trên các số dương bằng để thống nhất. Như một kiểm tra, tích phân sau được ước tính là tổng Riemann.

set.seed(17)
x <- rexp(1000)
#
# Compute a bandwidth.
#
h <- density(x, kernel="gaussian")$bw # $
#
# Compute edge weights.
#
w <- 1 / pnorm(0, mean=x, sd=h, lower.tail=FALSE)
#
# The truncated weighted density is what we want.
#
d <- density(x, bw=h, kernel="gaussian", weights=w / length(x))
d$y[d$x < 0] <- 0
#
# Check: the integral ought to be close to 1:
#
sum(d$y * diff(d$x)[1])
#
# Plot the two density estimates.
#
par(mfrow=c(1,1))
plot(d, type="n", main="Default and truncated densities", xlim=c(-1, 5))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)

21

Một cách khác là cách tiếp cận của Kooperberg và các đồng nghiệp, dựa trên việc ước tính mật độ bằng cách sử dụng spline để xấp xỉ mật độ log của dữ liệu. Tôi sẽ đưa ra một ví dụ sử dụng dữ liệu từ câu trả lời của @ whuber, điều này sẽ cho phép so sánh các phương pháp tiếp cận.

set.seed(17)
x <- rexp(1000)

Bạn sẽ cần gói logspline được cài đặt cho việc này; cài đặt nó nếu nó không phải là:

install.packages("logspline")

Tải gói và ước tính mật độ bằng logspline()hàm:

require("logspline")
m <- logspline(x)

Trong phần sau đây, tôi giả sử rằng đối tượng dtừ câu trả lời của @ whuber có mặt trong không gian làm việc.

plot(d, type="n", main="Default, truncated, and logspline densities", 
     xlim=c(-1, 5), ylim = c(0, 1))
polygon(density(x, kernel="gaussian", bw=h), col="#6060ff80", border=NA)
polygon(d, col="#ff606080", border=NA)
plot(m, add = TRUE, col = "red", lwd = 3, xlim = c(-0.001, max(x)))
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)

Biểu đồ kết quả được hiển thị bên dưới, với mật độ logspline được hiển thị bằng đường màu đỏ

Mật độ mặc định, cắt ngắn và logspline

Ngoài ra, hỗ trợ cho mật độ có thể được chỉ định thông qua các đối số lboundubound. Nếu chúng ta muốn giả sử rằng mật độ là 0 ở bên trái của 0 và có sự gián đoạn ở 0, ví dụ , chúng ta có thể sử dụng lbound = 0trong cuộc gọi đếnlogspline()

m2 <- logspline(x, lbound = 0)

Mang lại ước tính mật độ sau đây (hiển thị ở đây với mlogspline ban đầu phù hợp vì hình trước đó đã trở nên bận rộn).

plot.new()
plot.window(xlim = c(-1, max(x)), ylim = c(0, 1.2))
title(main = "Logspline densities with & without a lower bound",
      ylab = "Density", xlab = "x")
plot(m,  col = "red",  xlim = c(0, max(x)), lwd = 3, add = TRUE)
plot(m2, col = "blue", xlim = c(0, max(x)), lwd = 2, add = TRUE)
curve(exp(-x), from=0, to=max(x), lty=2, add=TRUE)
rug(x, side = 3)
axis(1)
axis(2)
box()

Biểu đồ kết quả được hiển thị bên dưới

So sánh các ước tính mật độ logspline có và không có giới hạn dưới về hỗ trợ

xx=0x


1
01

@whuber Câu hỏi hay. Gần đây tôi chỉ bắt gặp cách tiếp cận này. Tôi nghi ngờ một câu hỏi hay được đặt ra ở đây là, vì các phương pháp rút gọn và logspline chỉ là ước tính về mật độ thực, liệu sự khác biệt về sự phù hợp có ý nghĩa, theo thống kê? Tôi không chắc chắn chính xác tại sao nó làm rất tốt ở mức 0, mặc dù. Tôi đánh giá cao biết tại sao quá.
Phục hồi Monica - G. Simpson

@GavinSimpson, Cảm ơn câu trả lời hay này. Bạn có thể sao chép cốt truyện cuối cùng với phiên bản mới nhất logsplinekhông? Đối với tôi, mật độ của cả hai, phiên bản giới hạn và không giới hạn đều về không x = 0.
cel

4

Để so sánh phân phối theo nhóm (mà bạn nói là mục tiêu trong một trong những bình luận của bạn) tại sao không phải là một cái gì đó đơn giản hơn? Các ô song song hoạt động độc đáo nếu N lớn; sơ đồ dải song song hoạt động nếu N nhỏ (và cả hai hiển thị tốt hơn, mà bạn nói là một vấn đề trong dữ liệu của bạn).


1
Vâng, cảm ơn, điều đó làm việc. Nhưng tôi thích lô đất mật độ. Họ hiển thị nhiều hơn về dữ liệu so với boxplots. Tôi đoán tôi hơi ngạc nhiên vì dường như không có gì đã được thực hiện. Có lẽ tôi sẽ tự mình thực hiện một trong những điều này. Mọi người có lẽ sẽ thấy nó hữu ích.
generic_user

1
Tôi cũng thích lô đất mật độ; nhưng bạn phải xem xét đối tượng của bạn.
Peter Flom - Tái lập Monica

1
Phải đồng ý với @PeterFlom về điều này. Đừng quá phức tạp nếu khán giả của bạn không hiểu biết về mặt thống kê. Bạn cũng có thể thực hiện các ô hình hộp so sánh / song song với một lớp phủ các ô bướm trên đầu. Bằng cách đó, tóm tắt cốt truyện hộp có thể nhìn thấy cũng như tất cả các dữ liệu.
doug.numbers

Đề xuất rằng những người khác nhau hiểu các lô tổng hợp khác nhau chắc chắn là chính xác. Mặc dù hiểu được âm mưu mật độ là gì (và hiểu rằng đó không phải là xác suất) Tôi không hiểu "hộp song song" có thể là gì. Nó cho thấy một âm mưu tọa độ song song nhưng tôi nghi ngờ đó là không chính xác.
DWin

2

Như Stéphane nhận xét bạn có thể sử dụng from = 0và, ngoài ra, bạn có thể biểu thị các giá trị của mình dưới đường cong mật độ vớirug (x)


4
Sửa lỗi cho tôi nếu tôi sai nhưng có from=0vẻ như nó chỉ triệt tiêu âm mưu cho các giá trị dưới 0; nó không chính xác tính toán cho thực tế là một số phân phối đã bị bôi bẩn dưới 0.
Nick Cox

1
Đúng rồi. Sử dụng fromlệnh mang lại một âm mưu trông giống như nó có cực đại đúng bằng không. Nhưng nếu bạn nhìn vào biểu đồ với các thùng nhỏ liên tục, rất nhiều dữ liệu sẽ hiển thị đỉnh AT bằng không. Đây fromchỉ là một thủ thuật đồ họa.
generic_user

@NickCox Tôi không chắc nhưng tôi không nghĩ sẽ from=0kìm nén điều gì. Nó chỉ bắt đầu "lưới" ở mức 0.
Stéphane Laurent

Sự khác biệt là liệu mật độ ước tính có khác không đối với các giá trị âm, không phải là nó có được vẽ hay không. Các nhà nghiên cứu có thể quyết định không lo lắng về điều này nếu tất cả những gì họ muốn là một hình ảnh trực quan.
Nick Cox

@NickCox Lệnh density(rexp(100), from=0)không liên quan gì đến đồ họa
Stéphane Laurent
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.