R에서 음이 아닌 변수의 밀도 플롯에 대한 좋은 방법?


36
plot(density(rexp(100))

분명히 0 왼쪽의 모든 밀도는 바이어스를 나타냅니다.

통계가 아닌 사람들을 위해 일부 데이터를 요약하려고하는데, 음이 아닌 데이터가 왜 밀도가 0의 왼쪽인지에 대한 질문을 피하고 싶습니다. 플롯은 무작위 검사 용입니다. 처리 및 제어 그룹별로 변수 분포를 보여주고 싶습니다. 분포는 종종 지수 적입니다. 히스토그램은 여러 가지 이유로 까다 롭습니다.

빠른 Google 검색을 통해 통계 전문가가 음이 아닌 커널에 대해 작업 할 수 있습니다 (예 : this) .

그러나 R로 구현 된 것이 있습니까? 구현 된 메소드 중에서 설명 통계에 대해 "최상"의 방법이 있습니까?

편집 : from명령으로 현재의 문제를 해결할 수 있더라도 음이 아닌 밀도 추정에 대한 문헌을 기반으로 커널을 구현했는지 여부를 아는 것이 좋습니다.


3
당신이 요구하는 것은 아니지만, 특히 통계가 아닌 청중에게 프리젠 테이션을 위해 기하 급수적으로 커널 밀도 추정을 적용하지 않을 것입니다. Quantile-quantile 플롯을 사용하고 분포가 지수 형일 경우 플롯이 직선이어야한다고 설명합니다.
Nick Cox

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

4
때로는 상당히 성공적으로 수행 한 한 가지 방법은 로그에서 kde를 얻은 다음 밀도 추정값을 변환하는 것입니다 (Jacobian을 잊지 말 것). 다른 가능성은 로그 스플라인 밀도 추정값을 사용하여 경계에 대해 알 수 있도록하는 것입니다.
Glen_b


1
나는 stata-journal.com/sjpdf.html?articlenum=gr0003에서 @Glen_b가 언급 한 변환 방법에 대해 논의했습니다 (pp.76-78 참조). log 대신에 log (x + 1)을 사용하고 Jacobian을 수정하면 0을 사용할 수 있습니다.
Nick Cox

답변:


21

공간 통계의 에지 가중치에 대한 접근 방식에서 빌린 한 가지 솔루션은 0에서 왼쪽의 밀도를 자르지 만 0에 가장 가까운 데이터를 늘리는 것입니다. 아이디어는 각 값 가 중심으로하는 단위 총 면적의 커널로 "확산된다"는 것이다 . 부정적인 영역으로 흘러 들어가는 커널의 모든 부분이 제거되고 커널은 단위 영역으로 다시 정규화됩니다.xxx

예를 들어 가우스 커널 의 경우 정규화 가중치는Kh(y,x)=exp(12((yx)/h)2)/2π

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

여기서 는 평균 의 정규 변량 및 표준 편차 의 누적 분포 함수입니다 . 다른 커널에서도 비슷한 공식을 사용할 수 있습니다.x 시간Φxh

대역폭을 가깝게 좁히는 것보다 훨씬 간단하고 계산 속도가 훨씬 빠릅니다 . 어쨌든 대역폭이 근처 에서 어떻게 변경되어야 하는지를 정확히 규정하는 것은 어렵 습니다. 그럼에도 불구하고,이 방법은 특별하다 : 근처에 여전히 약간의 편차가있을 것이다 . 기본 밀도 추정값보다 나은 것으로 보입니다. 지연된 데이터 세트를 사용한 비교는 다음과 같습니다.0 0000

그림

파란색은 기본 밀도를 나타내며 빨간색은 에서 가장자리에 대해 조정 된 밀도를 나타냅니다 . 실제 기본 분포는 참조 용 점선으로 추적됩니다.0


R 코드

density함수는 R모든 실수에 대한 적분이 단일되기를 원하기 때문에 가중치의 합이 단일성이 아니라고 불평하지만,이 방법은 양수에 대한 적분을 단일과 동일하게 만듭니다. 확인으로 후자의 적분은 리만 합계로 추정됩니다.

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

대안은 데이터의 로그 밀도를 근사하기 위해 스플라인을 사용하여 밀도를 추정하는 것에 기반한 Kooperberg 및 동료의 접근 방식입니다. @whuber의 답변 데이터를 사용하여 예제를 보여 드리겠습니다. 접근법을 비교할 수 있습니다.

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

이를 위해 logspline 패키지가 설치되어 있어야합니다. 그렇지 않은 경우 설치하십시오 :

install.packages("logspline")

패키지를로드하고 logspline()함수를 사용하여 밀도를 추정하십시오 .

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

다음에서는 d@whuber의 답변 의 객체 가 작업 공간에 있다고 가정합니다 .

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)

결과 플롯은 아래에 표시되며 로그 선 밀도는 빨간색 선으로 표시됩니다.

기본, 잘림 및 로그 스플라인 밀도

또한, 밀도에 대한 지원은 인수를 통해 지정 될 수 있습니다 lboundubound. 우리는 밀도가 0의 왼쪽에 0이라고 가정 할과 불연속이 0이 있다면, 우리가 사용할 수있는 lbound = 0호출에 logspline()예를 들어,

m2 <- logspline(x, lbound = 0)

다음 밀도 추정값을 산출합니다 ( m이전 그림이 이미 사용 중이므로 원래 로그 라인에 맞게 표시됨).

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()

결과 플롯은 아래와 같습니다.

지지에 대한 하한이 있거나없는 로그 스플라인 밀도 추정값의 비교

이 경우, 지식에 대한 지식을 활용 x하면 에서 0이 아닌 밀도 추정치를 얻을 수 있지만 다른 곳에 맞는 표준 로그 라인과 비슷합니다.x=0x


1
이러한 생각하지만 오전과 같은 하나 나는 그것이 작동 놀라게 그래서 (지수 분포에서) 예제 데이터와 잘. 왜 그런지 직감이 있습니까? 어떤 의미에서 그것은 근처에서 훌륭하게 수행 되지만 실제 데이터 에서 근처의 값의 "집중"이 누락 되어 있으므로 낮은 값에서 좋은 정확도와 낮은 정확도 (또는 동등하게) 사이에 어떤 종류의 상충 관계가 없는지 궁금합니다. 높은 값에서 큰 대역폭). 101
whuber

@whuber 좋은 질문입니다. 나는 최근에이 접근법을 만났다. 잘린 질문과 로그 스플라인 방법은 실제 밀도의 추정치이므로 차이가 통계적으로 유의미하게 적합합니까? 그래도 왜 제로에서 그렇게 잘하는지 잘 모르겠습니다. 왜 그런지 알고 싶습니다.
복원 모니카

@GavinSimpson,이 멋진 답변에 감사드립니다. 최신 버전의 마지막 플롯을 재현 할 수 있습니까 logspline? 나에게, 경계 버전과 한계 버전의 밀도는 0에서 0으로 이동합니다 x = 0.
cel

4

그룹별로 분포를 비교하려면 (설명 중 하나의 목표라고 말하면) 왜 더 간단하지 않습니까? N이 크면 평행 상자 그림이 잘 작동합니다. 병렬 스트립 플롯은 N이 작 으면 작동합니다 (둘 다 특이 치가 잘 나타나므로 데이터에 문제가 있음).


1
예, 고맙습니다. 그러나 나는 밀도 플롯을 좋아합니다. 박스 플롯보다 데이터에 대해 더 많이 보여줍니다. 나는 이미 구현 된 것이 아무것도 없다는 것에 놀랐습니다. 어쩌면 나는 언젠가 이러한 것들 중 하나를 구현할 것입니다. 사람들은 아마 유용 할 것입니다.
generic_user

1
나도 밀도 플롯을 좋아한다; 그러나 청중을 고려해야합니다.
Peter Flom-Monica Monica 복원

1
이것에 대해 @PeterFlom에 동의해야합니다. 잠재 고객이 통계적으로 지식이없는 경우 너무 복잡하지 마십시오. 상단에 나비 플롯을 오버레이하여 비교 / 병렬 상자 플롯을 수행 할 수도 있습니다. 이렇게하면 상자 그림 요약과 모든 데이터가 표시됩니다.
doug.numbers

다른 사람들이 집계 된 음모를 다르게 이해한다는 제안은 확실합니다. 밀도 플롯이 무엇인지 이해하고 (확률이 아님을 이해) "병렬 박스 플롯"이 무엇인지 이해할 수 없습니다. 평행 좌표 플롯을 제안하지만 이것이 올바르지 않은 것 같습니다.
DWin

2

스테판 (Stéphane)은 주석을 사용할 수 from = 0있으며, 밀도 곡선 아래에서rug (x)


4
내가 틀렸다면 수정하지만 from=00 미만의 값에 대한 플롯을 억제하는 것처럼 보입니다. 분포의 일부가 0 미만으로 번졌다는 사실에 대한 계산은 정확하지 않습니다.
Nick Cox

1
맞아요. 이 from명령을 사용하면 피크가 바로 0 인 것처럼 보이는 플롯이 생성됩니다. 그러나 연속적으로 더 작은 구간이있는 히스토그램을 보면 많은 데이터에 최대 AT 0이 표시됩니다. 이것은 from단지 그래픽 트릭입니다.
generic_user

@NickCox 확실하지 않지만 from=0아무것도 억제 하지 않는다고 생각 합니다. "그리드"는 0에서 시작합니다.
Stéphane Laurent

차이는 음의 값에 대해 추정 밀도가 0이 아닌지 여부이며, 플롯 여부와 관계가 없습니다. 연구원들이 원하는 것이 시각화라면 걱정하지 않기로 결정할 수도 있습니다.
Nick Cox

@NickCox이 명령 density(rexp(100), from=0)은 그래픽과 관련이 없습니다
Stéphane Laurent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.