경험적 확률 밀도 간의 중첩을 계산하는 방법은 무엇입니까?


14

두 샘플 간의 유사성을 측정하기 위해 R에서 두 커널 밀도 추정치 사이의 겹침 영역을 계산하는 방법을 찾고 있습니다. 명확히하기 위해, 다음 예에서, 자 p 중첩 영역의 면적을 정량화해야합니다.

library(ggplot2)
set.seed(1234)
d <- data.frame(variable=c(rep("a", 50), rep("b", 30)), value=c(rnorm(50), runif(30, 0, 3)))
ggplot(d, aes(value, fill=variable)) + geom_density(alpha=.4, color=NA)

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

비슷한 질문이 여기 에서 논의되었지만 차이점은 미리 정의 된 정규 분포가 아닌 임의의 경험적 데이터에 대해이 작업을 수행해야한다는 것입니다. overlap패키지 주소이 질문에,하지만 분명히 오직 나를 위해 작동하지 않습니다 타임 스탬프 데이터에 대한. Bray-Curtis 지수 ( vegan패키지 vegdist(method="bray")기능 으로 구현 됨 )도 다소 다른 데이터와 관련이있는 것으로 보입니다.

나는 이론적 접근법과 그것을 구현하기 위해 사용할 수있는 R 함수에 관심이 있습니다.


2
"보라색 영역을 정량화"는 가설 검정이 아니라 추정에 문제가 있으므로 "표준 인용 가능 통계 검정을 사용하여이를 달성 할 수 없습니다 ". 당신은 자신과 모순됩니다. 실제로 원하는 것을 명확히하십시오 . 두 KDE의 겹치는 영역의 추정치 만 있으면 간단한 계산입니다.
Glen_b-복지국 모니카

의견을 보내 주셔서 감사합니다. @ 비 통계적 사고를 명확히하는 데 도움이되었습니다. 나는 KDE 사이의 겹치는 영역이 실제로 내가 찾고있는 것이라고 생각합니다. 나는 그것을 반영하기 위해 질문을 편집했습니다.
mmk

2
이 방법에서 임의의 위험에 대해 매우 우려하고 있습니다. 커널 대역폭에 따라 계산 간의 오버랩 어떤 두 데이터 세트는 모든 구간에서 선택된 값과 동일하게 될 수있다 . 기본 대역폭은이 목적에 최적화되어 있지 않으므로 놀랍거나 임의적이거나 일관성이없는 결과를 얻을 수 있습니다. 음수가 아닌 데이터 또는 비율과 같은 자연 경계를 가진 데이터 세트는 원치 않는 가장자리 효과를 추가로 발생시킵니다. 대신 무엇을해야합니까? 이 계산의 이유부터 시작하십시오.이 "유사성"의 의미는 무엇입니까? (0,1)
whuber

같은 질문이 몇 달 후에 나타 났지만 교차점을 언급했지만 고려할 수있는 몇 가지 유효한 메모가있었습니다. 언급 된 질문에는 두 가지 경험적 분포가 있습니다. 이 게시물은 커널 밀도 추정 및 정규 분포를 통해서만 답변하므로 링크를 추가하십시오. 아래 링크는 경험적 분포 쌍에 대한 질문으로 확장됩니다. stats.stackexchange.com/questions/122857/… – Barnaby 7 시간 전
Barnaby

답변:


9

2 개의 커널 밀도 추정치의 중첩 영역은 임의의 원하는 정확도로 근사 될 수있다.

1) 원래 KDE가 일부 그리드에 대해 평가되었으므로 그리드가 두 그리드에 대해 동일하거나 쉽게 동일하게 만들 수 있다면 운동은 간단하게 취하는 것 ( K 1 ( x ) , K 2 ( x ) ) 를 누른 다음 사다리꼴 규칙 또는 중간 점 규칙을 사용합니다.min(K1(x),K2(x))

두 그리드가 다른 그리드에 있고 동일한 그리드에서 쉽게 다시 계산할 수없는 경우 보간을 사용할 수 있습니다.

1hK(xxih)

그러나 위의 whuber의 의견은 분명히 명심해야합니다. 이것이 반드시 의미있는 일은 아닙니다.


방법 1 및 방법 2와 관련된 오류를 어떻게 계산합니까?
olliepower

정상적인 상황에서는 커널 밀도 추정치의 오류와 비교할 때 두 가지 모두 미묘하므로 걱정하지 않아도됩니다. 사다리꼴 방법과 다른 수치 적분법으로 오차 범위를 계산할 수 있습니다. 이러한 계산은 매우 표준 적이지만 KDE가 큰 불확실성을 가지고 있기 때문에 무의미합니다. 방법 2는 계산의 누적 반올림 오차에 정확합니다.
Glen_b-복지국 모니카

1
이 방법론 제안은 귀하의 답변에 대단히 감사합니다. 나는 이것을 R에서 구현하는 데 노력할 것이지만, 초보자로서 이것을 깨끗하게 코딩하는 방법에 대한 제안에 관심이있을 것입니다.
mmk

10

완전성을 기하기 위해 R에서 이것을 끝내는 방법은 다음과 같습니다.

# simulate two samples
a <- rnorm(100)
b <- rnorm(100, 2)

# define limits of a common grid, adding a buffer so that tails aren't cut off
lower <- min(c(a, b)) - 1 
upper <- max(c(a, b)) + 1

# generate kernel densities
da <- density(a, from=lower, to=upper)
db <- density(b, from=lower, to=upper)
d <- data.frame(x=da$x, a=da$y, b=db$y)

# calculate intersection densities
d$w <- pmin(d$a, d$b)

# integrate areas under curves
library(sfsmisc)
total <- integrate.xy(d$x, d$a) + integrate.xy(d$x, d$b)
intersection <- integrate.xy(d$x, d$w)

# compute overlap coefficient
overlap <- 2 * intersection / total

언급 한 바와 같이, KDE 생성과 통합에도 고유 한 불확실성과 주관성이 있습니다.


2
CRAN overlapping에 2 개 이상의 경험적 분포의 중첩 영역을 추정 하는 패키지가 있습니다 . 여기에서 설명서를 확인하십시오. rdocumentation.org/packages/overlapping/versions/1.5.0/topics/…
Stefan Avey

x,dx,dx,d

@mmk 2D 밀도를 위해 이것을 할 수 있습니까?
거짓말 없음

4

첫째, 틀릴 수도 있지만 KDE (Kernel Density Estimates)가 교차하는 배수 점이있는 경우 솔루션이 작동하지 않을 것이라고 생각합니다. 둘째, overlap타임 스탬프 데이터와 함께 사용 하도록 패키지를 만들었지 만 두 KDE의 겹치는 영역을 추정하는 데 계속 사용할 수 있습니다. 데이터의 범위를 0에서 2π로 조정하기 만하면됩니다.
예를 들어 :

# simulate two sample    
 a <- rnorm(100)
 b <- rnorm(100, 2)

# To use overplapTrue(){overlap} the scale must be in radian (i.e. 0 to 2pi)
# To keep the *relative* value of a and b the same, combine a and b in the
# same dataframe before rescaling. You'll need to load the ‘scales‘ library.
# But first add a "Source" column to be able to distinguish between a and b
# after they are combined.
 a = data.frame( value = a, Source = "a" )
 b = data.frame( value = b, Source = "b" )
 d = rbind(a, b)
 library(scales) 
 d$value <- rescale( d$value, to = c(0,2*pi) )

# Now you can created the rescaled a and b vectors
 a <- d[d$Source == "a", 1]
 b <- d[d$Source == "b", 1]

# You can then calculate the area of overlap as you did previously.
# It should give almost exactly the same answers.
# Or you can use either the overlapTrue() and overlapEst() function 
# provided with the overlap packages. 
# Note that with these function the KDE are fitted using von Mises kernel.
 library(overlap)
  # Using overlapTrue():
   # define limits of a common grid, adding a buffer so that tails aren't cut off
     lower <- min(d$value)-1 
     upper <- max(d$value)+1
   # generate kernel densities
     da <- density(a, from=lower, to=upper, adjust = 1)
     db <- density(b, from=lower, to=upper, adjust = 1)
   # Compute overlap coefficient
     overlapTrue(da$y,db$y)


  # Using overlapEst():            
    overlapEst(a, b, kmax = 3, adjust=c(0.8, 1, 4), n.grid = 500)

# You can also plot the two KDEs and the region of overlap using overlapPlot()
# but sadly I haven't found a way of changing the x scale so that the scale 
# range correspond to the initial x value and not the rescaled value.
# You can only change the maximum value of the scale using the xscale argument 
# (i.e. it always range from 0 to n, where n is set with xscale = n).
# So if some of your data take negative value, you're probably better off with
# a different plotting method. You can change the x label with the xlab
# argument.  
  overlapPlot(a, b, xscale = 10, xlab= "x metrics", rug=T)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.