R에서 0으로 팽창 된 매개 변수의 밀도를 어떻게 추정 할 수 있습니까?


10

다음과 같이 0이 많은 데이터 세트가 있습니다.

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)

밀도에 대한 선을 그리려고하지만 density()함수는 x의 음수 값을 계산하는 이동 창을 사용합니다.

lines(density(x), col = 'grey')

거기에있다 density(... from, to)주장하지만,이 경우에만 0의 밀도는 다음과 같은 그래프로 볼 수있는 것처럼 데이터와 일치 그래서 창을 변경, 계산을 자르지 것 같다 :

lines(density(x, from = 0), col = 'black')

(보간이 변경되면 검은 선은 회색 선보다 0에서 밀도가 더 높을 것으로 예상합니다)

0에서 밀도를 더 잘 계산할 수있는이 기능에 대한 대안이 있습니까?

여기에 이미지 설명을 입력하십시오

답변:


14

이산 스파이크를 포함하므로 밀도는 0에서 무한대입니다. 0의 비율을 사용하여 스파이크를 추정 한 다음 부드럽다 고 가정하면 밀도의 양의 부분을 추정해야합니다. KDE는 음수 값에 약간의 가중치를 부여하기 때문에 왼쪽 끝에 문제를 일으킬 수 있습니다. 유용한 방법 중 하나는 로그로 변환하고 KDE를 사용하여 밀도를 추정 한 다음 다시 변환하는 것입니다. 참조 지팡이, 마론 & 루퍼트 (1991 JASA) 참조하십시오.

다음 R 함수는 변환 된 밀도를 수행합니다.

logdensity <- function (x, bw = "SJ") 
{
    y <- log(x)
    g <- density(y, bw = bw, n = 1001)
    xgrid <- exp(g$x)
    g$y <- c(0, g$y/xgrid)
    g$x <- c(0, xgrid)
    return(g)
}

그런 다음 다음은 원하는 줄거리를 제공합니다.

set.seed(1)
x <- c(rlnorm(100),rep(0,50))
hist(x,probability=TRUE,breaks = 25)
fit <- logdensity(x[x>0]) # Only take density of positive part
lines(fit$x,fit$y*mean(x>0),col="red") # Scale density by proportion positive
abline(v=0,col="blue") # Add spike at zero.

여기에 이미지 설명을 입력하십시오


(엑스=0)

(엑스=0)

이것은 편리합니다. 참고 : bw = "SJ"는 변환되지 않은 공간의 밀도에 영향을 주지만 "SJ"와 기본 "nrd0"을 사용하여 로그 밀도는 동일합니다 ... SJ 참조를 읽으려고합니다. "Sheather and Jones (1991) 커널 밀도 추정을위한 안정적인 데이터 기반 대역폭 선택 방법. " jstor.org/stable/2345597
Abe

4

Rob Hyndman에 동의하면 제로를 별도로 처리해야한다는 데 동의합니다. '반사', '정규화'및 '선형 조합'을 포함하여 경계가 지원되는 변수의 커널 밀도 추정을 처리하는 몇 가지 방법이 있습니다. 이들은 R의 density기능 으로 구현되지 않은 것으로 보이지만 Stan의 Benn Jann kdens패키지 에서 사용할 수 있습니다 .


1

논리 하한이있는 데이터 (예 : 0이지만 다른 값일 수 있음)가있는 경우 데이터가 아래로 내려 가지 않으며 규칙적인 커널 밀도 추정값이 해당 범위 아래에 값을 배치합니다 (또는 상한이있는 경우) 또는 둘 다)는 로그 스플라인 추정을 사용하는 것입니다. R에 대한 logspline 패키지는이를 구현하고 함수에는 범위를 지정하기위한 인수가 있으므로 추정값은 경계로 넘어가지만 여전히 1로 스케일되지 않습니다.

또한 oldlogspline간격 검열을 고려할 방법 ( 함수)도 있습니다. 따라서 0이 정확한 0이 아니지만 반올림하여 0과 다른 숫자 사이의 값 (예 : 감지 한계)을 나타내는 경우 반올림됩니다. 피팅 기능에 해당 정보를 제공 할 수 있습니다.

여분의 0이 참인 경우 (반올림되지 않은) 스파이크 또는 점 질량을 추정하는 것이 더 나은 방법이지만 로그 스플라인 추정과 결합 할 수도 있습니다.


0

대역폭을 낮추려고 할 수 있습니다 (파란색 선은 adjust=0.5). 여기에 이미지 설명을 입력하십시오

그러나 아마도 KDE는 그러한 데이터를 다루는 가장 좋은 방법은 아닙니다.


추천 할만한 다른 방법이 있습니까?
Abe

@Abe 글쎄, 이것은 당신이하고 싶은 것에 달려 있습니다 ...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.