업데이트 : 2011 년 4 월 7 일이 답변은 점점 길어지고 있으며 문제의 여러 측면을 다룹니다. 그러나 지금까지는 별도의 답변으로 나누었습니다.
이 예제 에서 Pearson의 성능에 대한 토론을 맨 아래에 추가했습니다 .χ2
브루스 엠 힐 (Bruce M. Hill)은 아마도 Zipf와 같은 맥락에서 추정에 관한 "세미나"논문을 작성했을 것이다. 그는 1970 년대 중반 주제에 관한 몇 가지 논문을 썼습니다. 그러나 "Hill Estimator"(현재 호출 됨)는 기본적으로 샘플의 최대 순서 통계에 의존하므로 현재 잘림 유형에 따라 문제가 발생할 수 있습니다.
주요 논문은 다음과 같습니다.
BM Hill, 분포의 꼬리에 대한 추론에 대한 간단한 일반적인 접근법 , Ann. 통계 1975 년
데이터가 처음에 Zipf이고 잘린 경우 정도 분포 와 Zipf 플롯 사이의 훌륭한 대응 관계 를 활용할 수 있습니다.
구체적으로, 정도 분포 는 단순히 각 정수 응답이 보이는 횟수의 경험적 분포,
디나는= # { j : X제이= 나는 }엔.
로그-로그 플롯 에서 에 대해 이것을 플롯하면 스케일링 계수에 해당하는 기울기를 갖는 선형 추세가 나타납니다.나는
한편, 우리는 플롯 경우 이는 Zipf 플롯 , 우리가 얻는 가장 큰에서 자신의 계급에 대한 값을 플롯 한 후 최소와 우리가 일종의 샘플, 다른 A를 선형 추세 서로 다른 기울기를. 그러나 경사는 관련이 있습니다.
경우 이는 Zipf 분포 스케일링 법칙 계수이고, 다음 제 플롯의 기울기는 두 번째 플롯의 기울기는 . 아래는 및 대한 예제 플롯입니다 . 왼쪽 창은 차수 분포이며 빨간색 선의 기울기는 입니다. 오른쪽은 Zipf 플롯이며 중첩 된 빨간색 선의 경사는 입니다.− α − 1 / ( α − 1 ) α = 2 n = 10 6 − 2 − 1 / ( 2 − 1 ) = − 1α− α− 1 / ( α − 1 )α = 2n=106−2−1/(2−1)=−1
따라서 일부 임계 값 보다 큰 값이 표시되지 않도록 데이터가 잘 렸지만 데이터가 Zipf- 분포되고 가 상당히 큰 경우 에는 도 분포 에서 를 추정 할 수 있습니다 . 매우 간단한 방법은 선을 로그 로그 플롯에 맞추고 해당 계수를 사용하는 것입니다.τ αττα
작은 값 이 표시되지 않도록 데이터가 잘 리면 (예 : 큰 웹 데이터 세트에 대해 많은 필터링이 수행되는 방식) Zipf 플롯을 사용하여 로그 로그 스케일의 기울기를 추정 한 다음 " 스케일링 지수를 되돌립니다. Zipf 플롯의 기울기 추정값이 . 그런 다음 스케일링 법칙 계수의 간단한 추정값은
α =1-1β^
α^=1−1β^.
@csgillespie는이 주제와 관련하여 미시간의 Mark Newman이 공동 저술 한 최근 논문을 제공했습니다. 그는 이것에 대해 비슷한 기사를 많이 출판하는 것 같습니다. 아래는 관심있는 다른 참고 문헌과 함께 또 하나 있습니다. 뉴먼은 통계적으로 가장 현명한 일을하지 않기 때문에 신중해야합니다.
MEJ 뉴먼, 전력 법, 파레토 분포 및 Zipf의 법칙 , 현대 물리학 46, 2005, 323-351 쪽.
M. Mitzenmacher, 전력 법 및 로그 정규 분포에 대한 생성 모형의 간략한 역사 , 인터넷 수학. , vol. 1 번 2, 2003, 226-251 쪽.
K. Knight, 견고성 및 바이어스 감소에 대한 응용 프로그램을 갖춘 Hill 추정기의 간단한 수정 , 2010.
부록 :
다음은 에서 간단한 시뮬레이션 을 통해 분포에서 크기 의 표본을 추출했을 때 예상 할 수있는 것을 보여줍니다 (원래 질문 아래의 주석에 설명되어 있음).10 5R105
> x <- (1:500)^(-0.9)
> p <- x / sum(x)
> y <- sample(length(p), size=100000, repl=TRUE, prob=p)
> tab <- table(y)
> plot( 1:500, tab/sum(tab), log="xy", pch=20,
main="'Truncated' Zipf simulation (truncated at i=500)",
xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)
결과 플롯은
그림에서, 우리는 정도 정도의 상대적 분포 오차 가 매우 좋다는 것을 알 수 있습니다. 공식적인 카이-제곱 검정을 수행 할 수는 있지만 데이터가 사전 지정된 분포를 따른다는 것을 엄격하게 알려주지 는 않습니다 . 단지 그렇지 않다는 결론을 내릴 증거가 없다고 알려줍니다 .i≤30
그러나 실제적인 관점에서 보면 그러한 음모는 상대적으로 매력적이어야합니다.
부록 2 : Maurizio가 아래 주석에서 사용하는 예를 고려해 봅시다. 최대 값 잘린 Zipf 분포를 사용하여 이고 이라고 가정합니다 ., N = 300α=2x m a x = 500n=300000xmax=500
Pearson의 통계량을 두 가지 방법으로 계산 합니다. 표준 방법은 통계
통해 여기서 는 표본에서 값의 관측 된 개수입니다. .X 2 = 500 ∑χ2 OiiEi=npi=ni−α/∑
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
또한 Maurizio의 스프레드 시트에 표시된대로 크기가 40 인 빈에 카운트를 먼저 비닝하여 생성 된 두 번째 통계도 계산합니다 (마지막 빈에는 20 개의 개별 결과 값의 합계 만 포함됩니다.
이 분포에서 크기가 표본 5000 개를 추출 하고이 두 가지 통계를 사용하여 값을 계산해 봅시다 .pnp
의 히스토그램 은 아래에 있으며 상당히 균일 한 것으로 보입니다. 경험적 제 1 종 오류율은 각각 0.0716 (표준, 비 바인드 방법) 및 0.0502 (바인드 방법)이며, 우리가 선택한 샘플 크기 5000의 목표 0.05 값과 통계적으로 크게 다르지 않습니다.p
다음은 코드입니다.R
# Chi-square testing of the truncated Zipf.
a <- 2
n <- 300000
xmax <- 500
nreps <- 5000
zipf.chisq.test <- function(n, a=0.9, xmax=500, bin.size = 40)
{
# Make the probability vector
x <- (1:xmax)^(-a)
p <- x / sum(x)
# Do the sampling
y <- sample(length(p), size=n, repl=TRUE, prob=p)
# Use tabulate, NOT table!
tab <- tabulate(y,xmax)
# unbinned chi-square stat and p-value
discrepancy <- (tab-n*p)^2/(n*p)
chi.stat <- sum(discrepancy)
p.val <- pchisq(chi.stat, df=xmax-1, lower.tail = FALSE)
# binned chi-square stat and p-value
bins <- seq(bin.size,xmax,by=bin.size)
if( bins[length(bins)] != xmax )
bins <- c(bins, xmax)
tab.bin <- cumsum(tab)[bins]
tab.bin <- c(tab.bin[1], diff(tab.bin))
prob.bin <- cumsum(p)[bins]
prob.bin <- c(prob.bin[1], diff(prob.bin))
disc.bin <- (tab.bin - n*prob.bin)^2/(n * prob.bin)
chi.stat.bin <- sum(disc.bin)
p.val.bin <- pchisq(chi.stat.bin, df=length(tab.bin)-1, lower.tail = FALSE)
# Return the binned and unbineed p-values
c(p.val, p.val.bin, chi.stat, chi.stat.bin)
}
set.seed( .Random.seed[2] )
all <- replicate(nreps, zipf.chisq.test(n, a, xmax))
par(mfrow=c(2,1))
hist( all[1,], breaks=20, col="darkgrey", border="white",
main="Histogram of unbinned chi-square p-values", xlab="p-value")
hist( all[2,], breaks=20, col="darkgrey", border="white",
main="Histogram of binned chi-square p-values", xlab="p-value" )
type.one.error <- rowMeans( all[1:2,] < 0.05 )