Обновление : 7 апреля 2011 г. Этот ответ становится довольно длинным и охватывает несколько аспектов проблемы. Однако до сих пор я сопротивлялся, разбивая его на отдельные ответы.
В самом низу я добавил обсуждение производительности Пирсона для этого примера.χ2
Брюс М. Хилл написал, пожалуй, «основополагающую» статью об оценке в Zipf-подобном контексте. В середине 1970-х он написал несколько статей на эту тему. Тем не менее, «оценщик Хилла» (как он теперь называется) по существу полагается на статистику максимального порядка выборки, и поэтому, в зависимости от типа присутствующего усечения, это может привести к некоторым проблемам.
Основная статья:
Б. М. Хилл, простой общий подход к выводу о хвосте распределения , Ann. Стат. 1975 г.
Если ваши данные изначально являются Zipf, а затем усечены, то хорошее соответствие между распределением степеней и графиком Zipf может быть использовано в ваших интересах.
В частности, распределение степеней - это просто эмпирическое распределение числа раз, когда просматривается каждый целочисленный ответ,
di=#{j:Xj=i}n.
Если мы построим это против на графике log-log, мы получим линейный тренд с наклоном, соответствующим коэффициенту масштабирования.i
С другой стороны, если мы строим график Zipf , где мы сортируем выборку от наибольшего к наименьшему, а затем наносим значения на их ранги, мы получаем другой линейный тренд с другим наклоном. Однако склоны связаны между собой.
Если является коэффициентом закона масштабирования для распределения Zipf, то наклон на первом графике равен а наклон на втором графике равен . Ниже приведен пример графика для и . Левая панель - это распределение степеней, а наклон красной линии равен . Правая часть - это график Зипфа, с наложенной красной линией, имеющей наклон .- α - 1 / ( α - 1 ) α = 2 n = 10 6 - 2 - 1 / ( 2 - 1 ) = - 1α−α−1/(α−1)α=2n=106−2−1/(2−1)=−1
Таким образом, если ваши данные были усечены, так что вы не видите значений, превышающих некоторый порог , но в противном случае данные распределяются по Zipf, а достаточно велик, тогда вы можете оценить по распределению степеней . Очень простой подход состоит в том, чтобы подогнать линию к графику log-log и использовать соответствующий коэффициент.τ αττα
Если ваши данные усечены так, что вы не видите маленьких значений (например, как много фильтрации выполняется для больших наборов веб-данных), то вы можете использовать график Zipf для оценки наклона в масштабе log-log и затем " отступить "показатель масштабирования. Скажите, что ваша оценка наклона на графике Zipf равна . Тогда одной простой оценкой коэффициента закона масштабирования является
; & alpha ; =1-1β^
α^=1−1β^.
@csgillespie дал одну недавнюю статью, написанную в соавторстве с Марком Ньюманом в Мичигане на эту тему. Похоже, он публикует много похожих статей на эту тему. Ниже приведено еще несколько ссылок, которые могут представлять интерес. Ньюман иногда не делает ничего разумного статистически, поэтому будьте осторожны.
MEJ Newman, Степенные законы, распределения Парето и закон Ципфа , Современная физика 46, 2005, с. 323-351.
Mitzenmacher, краткая история генеративных моделей для степенного закона и логнормальных распределений , Internet Math. том 1, нет. 2, 2003, с. 226-251.
К. Найт, простая модификация оценки Хилла с приложениями к устойчивости и снижению смещения , 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 : Давайте рассмотрим пример, который Маурицио использует в своих комментариях ниже. Предположим, что и , с усеченным распределением Zipf, имеющим максимальное значение .n = 300α=2х м а х = 500n=300000xmax=500
Мы рассчитаем статистику Пирсона двумя способами. Стандартный способ - через статистику
где - это наблюдаемые значения значения в образце и .X 2 = 500 ∑ i = 1 ( O i - E i ) 2χ2 OiiEi=npi=ni-α/∑ 500 j = 1 j-α
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
Мы также вычислим вторую статистику, сформированную первым объединением счетчиков в ячейках размером 40, как показано в электронной таблице Маурицио (последняя ячейка содержит только сумму из двадцати отдельных конечных значений.
Давайте нарисуем 5000 отдельных выборок размера из этого распределения и вычислим используя эти две разные статистики.рnp
Гистограммы значений приведены ниже и выглядят достаточно однородными. Эмпирические коэффициенты ошибок типа I составляют соответственно 0,0716 (стандартный метод без объединения) и 0,0502 (метод с сортировкой), и ни один из них статистически значимо не отличается от целевого значения 0,05 для размера выборки 5000, который мы выбрали.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 )