データサンプルからZipf切り捨て分布のパラメーターを推定する方法


10

Zipfの推定パラメーターに問題があります。私の状況は次のとおりです:

サンプルセットがあります(Zipf分布に従う必要がある呼び出しを生成する実験から測定)。このジェネレーターが実際にzipf配布で呼び出しを生成することを示す必要があります。既にこのQ&Aを読みました。一連の最高周波数からZipfの法則係数を計算する方法は?しかし、トランケートされたディストリビューションを使用しているため、悪い結果に達しています。たとえば、生成プロセスの「s」値を「0.9」に設定した場合、報告されたQ&Aに記載されている「s」値を推定しようとすると、0.2 caに等しい「s」が得られます。これは、TRUNCATEDディストリビューションを使用していることが原因だと思います(zipfを切り捨てポイントで制限する必要があります。右側が切り捨てられます)。

切り捨てられたzipf分布でパラメーターを推定するにはどうすればよいですか?


明確にするために、正確に何を切り捨てていますか?値の分布またはZipfプロット自体?切り捨てポイントを知っていますか?切り捨てはデータのアーチファクトまたはデータ処理のアーチファクト(たとえば、ユーザーまたは実験者が行った何らかの決定)ですか?追加の詳細があれば参考になります。
2011

@枢機卿。(パート1/2)枢機卿に感謝します。さらに詳しく説明します。発信者ごとのボリュームのZipf(およびその他の配布)に続いてコールを生成するVoIPジェネレータがあります。このジェネレータが本当にこれらのディストリビューションに従っていることを確認する必要があります。Zipf分布の場合、切り捨てポイントを定義する必要があります(したがって、既知であり、値の分布を指します)。これは、ユーザーとスケールパラメーターによって生成される呼び出しの最大数です。特に私の場合、この値は500に等しく、1人のユーザーが最大500のコールを生成できることを示しています。
マウリツィオ

(パート2/2)設定するもう1つのパラメーターは、分布の広がりを定義するZipfのスケールパラメーターです(この場合、この値は0.9です)。すべてのパラメーター(サンプルのサイズ、ユーザーごとの頻度など)がありますが、データセットがzipf分布に従っていることを確認する必要があります。
マウリツィオ

したがって、によって分布を正規化しているように見えます。なぜなら、私が「切り捨てられたZipf」と考えるのであれば、0.9のスケーリングパラメータは不可能だからです。 。これらのデータを大量に生成でき、結果が500しか「ない」場合は、カイ二乗適合度検定を使用しないのはなぜですか。ディストリビューションにはロングテールがあるため、かなり大きなサンプルサイズが必要になる場合があります。しかし、それは一つの方法でしょう。別の迅速で汚い方法は、呼び出し数の小さな値に対して正しい経験的分布が得られることを確認することです。i=1500i0.9
枢機卿、

回答:


14

更新:2011年4月7日この回答は非常に長くなり、問題の複数の側面をカバーしています。しかし、私はこれまで、それを別々の答えに分けることに抵抗してきました。

この例では、ピアソンののパフォーマンスに関する説明を一番下に追加しました。χ2


Bruce M. Hillは、おそらくZipfのような文脈での推定に関する「論説的」な論文を執筆しました。彼は1970年代半ばにいくつかの論文を書いた。ただし、「Hill estimator」(現在は呼び出されています)は基本的にサンプルの最大次数統計に依存しているため、存在する打ち切りのタイプによっては、問題が発生する可能性があります。

主な論文は次のとおりです。

BM Hill、分布の裾について推論するための単純で一般的なアプローチAnn。統計 、1975年。

データが本当にZipfであり、その後に切り捨てられる場合、次数分布Zipfプロットの間の適切な対応を利用すると有利です。

具体的には、次数分布は、各整数応答が見られる回数の経験的分布、つまり

di=#{j:Xj=i}n.

これを対数対数プロットのに対してプロットすると、スケーリング係数に対応する勾配を持つ線形トレンドが得られます。i

一方、サンプルを最大から最小に並べ替えてランクに対して値をプロットするZipfプロットをプロットすると、異なる勾配の異なる線形トレンドが得られます。ただし、勾配は関連しています。

がZipf分布のスケーリング則係数である場合、最初のプロットの勾配はで、2番目のプロットの勾配はです。以下は、およびプロット例です。左側のペインは次数分布で、赤い線の傾きはです。右側はZipfプロットで、重ねられた赤い線は傾きを持っています。- α - 1 /α - 1 α = 2 、N = 10 6 - 2 - 1 /2 - 1 = - 1αα1/(α1)α=2n=10621/(21)=1

Zipf分布からのiidサンプルの次数分布(左)とZipf(右)プロット。

したがって、データが切り捨てられてしきい値より大きい値は表示されないが、データがZipf分布であり、がかなり大きい場合、次数分布からを推定できます。非常に単純なアプローチは、対数-対数プロットに線を当てはめ、対応する係数を使用することです。τ αττα

小さな値が表示されないようにデータが切り捨てられた場合(たとえば、大きなWebデータセットに対して多くのフィルタリングが行われる方法)、Zipfプロットを使用して対数対数スケールで勾配を推定し、次に「スケールアウト指数」。Zipfプロットからの勾配の推定がます。次に、スケーリング則係数の簡単な推定値は α =1-1β^

α^=11β^.

@csgillespieは、このトピックに関して、ミシガン州のMark Newmanが共同執筆した最近の1つの論文を発表しました。彼はこれについて多くの同様の記事を発表しているようです。以下は、興味深い他の参考文献と一緒に別のものです。ニューマンは統計的に最も賢明なことをしないことがありますので、注意してください。

MEJニューマン、べき法則、パレート分布とジップの法則Contemporary Physics 46、2005、pp。323-351。

M. Mitzenmacher、べき法則と対数正規分布の生成モデルの簡単な歴史」インターネット数学。、巻。1、いいえ。2、2003、pp.226-251。

K.ナイト、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)

結果のプロットは

「切り捨てられた」Zipfプロット(i = 500で切り捨て)

プロットから、(またはその程度)の次数分布の相対誤差が非常に良いことがわかります。正式なカイ2乗検定を実行できますが、これはデータが事前に指定された分布に従うことを厳密に示しているわけではありませ。それはあなたが彼らがそうではないと結論付ける証拠がないことをあなたに告げるだけです。i30

それでも、実際的な見地からは、そのような計画は比較的説得力があるはずです。


補遺2:以下のコメントでマウリツィオが使用する例を考えてみましょう。および、最大値を持つ切り捨てられたZipf分布を想定します。n = 300α=2x m a x = 500n=300000xmax=500

ピアソンの統計を2つの方法で計算します。標準的な方法は、統計 するですここで、はサンプルの値観測されたカウントであり、。X 2 = 500 Σ iが= 1O I - E I 2χ2 OIIEI=N、P、I=NI-α/Σ 500 J = 1 J-α

X2=i=1500(OiEi)2Ei
OiiEi=npi=niα/j=1500jα

Maurizioのスプレッドシートに示されているように、最初にサイズ40のビンにカウントをビニングすることによって形成された2番目の統計も計算します(最後のビンには、20個の個別の結果値の合計のみが含まれます。

この分布からサイズ 5000個の個別のサンプルを描画し、これら2つの異なる統計を使用して値を計算します。pnp

値のヒストグラムは下にあり、非常に均一であることがわかります。経験的なタイプIのエラー率はそれぞれ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 )

+1、いつものように素晴らしい答え。モデレーターとして自分を指名する必要があります。まだ1時間残っています:)
mpiktas

@mpiktas、お世辞と励ましをありがとう。すでに非常に強力で、一律に、私よりも長く参加した候補者の候補者を指名することを正当化できるかどうかはわかりません。
枢機卿、

@cardinal、ここにヒルの推定量の代替案へのリンクがあります:Paulauskasによる元の記事VaiciulisGadeikisとPaulauskasによるフォローアップ。この推定者は、おそらく元のヒルのものよりも優れた特性を持っていました。
mpiktas 2011

@mpiktas、リンクをありがとう。Hill推定量の「新規および改良された」バージョンはかなりあります。元のアプローチの主な欠点は、平均化を停止する場所について「カットオフ」を選択する必要があることです。主にそれは主観性の訴えを開く「目玉」によって行われたと思います。私が思い出すと、ロングテール分布に関するResnickの本の1つは、これについてある程度詳しく説明しています。彼の最近のものだと思う。
枢機卿、

@cardinal、どうもありがとうございます。あなたはとても親切で、とても詳細です!Rでの例は私にとって非常に役に立ちましたが、この場合、正式なカイ2乗検定をどのように実行できますか?(私は一様、指数、正規などの他の分布でカイ二乗検定を使用しましたが、zipf..Sorryについて多くの疑いがありますが、これはこれらのトピックへの私の最初のアプローチです)。モデレーターへの質問:「切り詰められたzipf分布に対してカイ二乗検定をどのように実行するか」のような別のQ&Aを書く必要がありますか?または、このQ&Aを続けて、タグとタイトルを更新しますか?
マウリツィオ

5

Clauset、A et alPower-law Distributions in Empirical Data。2009年

べき乗則モデルをフィッティングする方法についての非常に良い説明が含まれています。関連するWebページにはコードサンプルがあります。残念ながら、それは切り捨てられたディストリビューションのコードを提供しませんが、ポインタを与えるかもしれません。


余談ですが、このペーパーでは、多くの「べき乗データセット」が対数正規分布または指数分布を使用して同等に(場合によってはより適切に)モデル化できるという事実について説明しています。


残念ながら、このペーパーでは切り捨てられた分布については何も述べていません。Rで、Zipf推定パラメーターを単純な方法で処理するパッケージ(zipfR、VGAM)を見つけましたが、切り捨てられた分布には「特別な扱い」が必要です。最後の文で、指数分布などのべき乗則データセットをモデル化して、「切り捨てられた」指数分布に推定パラメータープロセスを適用することが可能であることを意味しましたか?私はこのトピックで非常に初心者です!
マウリツィオ

この論文では、著者は、べき法則が適用されたさまざまなデータセットを再分析しています。著者は、多くの場合、べき乗則モデルはそれほど大きくなく、代替の分布がより良いであろうと指摘します。
csgillespie

2

ユーザー枢機卿の詳細な回答に続いて、私は推定の切り捨てられたzipf分布に対してカイ2乗検定を実行しました。カイ二乗検定の結果を次の表に示します。

ここに画像の説明を入力してください

たとえば、StartIntervalEndIntervalは呼び出しの範囲を表し、Observedは0から19までの呼び出しを生成する呼び出し元の数などです。カイ2乗検定は、最後の列に到達するまで有効で、最後の列が増加します。計算。それ以外の場合は、その時点まで「部分」カイ2乗値は許容範囲でした。

他のテストでも結果は同じで、最後の列(または最後の2列)は常に最終値を増やし、別の検証テストを使用するかどうか(および方法)がわからない。

PS:完全を期して、期待値(Expected)を計算するには、次のように枢機卿の提案に従います。

ここに画像の説明を入力してください

ここX_Iのを計算するために使用される: x <- (1:n)^-SP_I 'を算出するのp <- x / sum(x)と、最終的にE_i(コールの各NRに対するユーザーの期待NR)をすることによって得られますP_i * Total_Caller_Observed

自由度= 13の場合、カイ二乗の善は常に、検定統計量(この場合は64、14)がカイ二乗表で報告されたもの「デメリット」よりも大きいため、サンプルセットがZipf分布に従うという仮説を常に拒否します。最後の列。グラフィカルな結果はここに報告されます: ここに画像の説明を入力してください

切り捨てポイントは500に設定されていますが、取得できる最大値は294です。最後の「分散」がカイ2乗検定の失敗の原因であると思います。

更新!!

上記の回答で報告されたRコードで生成された推定zipfデータサンプルに対してカイ二乗検定を実行しようとしました。

> x <- (1:500)^(-2)
> p <- x / sum(x)
> y <- sample(length(p), size=300000, repl=TRUE, prob=p)
> tab <- table(y)
> length(tab)
[1] 438
> plot( 1:438, 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)

関連するプロットは次のとおりです。 ここに画像の説明を入力してください

カイ二乗検定の結果は、次の図に報告されています。 ここに画像の説明を入力してください

カイ二乗検定統計量(44,57)は、選択した自由度での検証には高すぎます。この場合も、データの最終的な「分散」がカイ二乗値が高い原因です。しかし、このzipf分布を検証する手順があります(「間違った」ジェネレーターに関係なく、Rデータサンプルに焦点を当てたいと思います)。


@Maurizio、なんらかの理由で、これまでこの投稿を見逃しました。とにかくそれを編集して私の投稿の最後のプロットと同様のプロットを追加できますが、観測されたデータを使用しますか?問題の診断に役立つ場合があります。一様分布の生成に問題があったという別の質問があったので、これらの分析にも当てはまると思います。(?)よろしく。
枢機卿、

@cardinal、結果を更新しました!どう思いますか?一様分布に関する質問は、より良い方法で指定する必要があるもう1つのことであり、今日または明日それを行います;)
Maurizio

S=0.9

p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675。これが上記のシミュレーションとどの程度一致しているかに注意してください。
枢機卿

@cardinal、私はまた、生成手順に「誤り」があると思います(私の目標は、このジェネレータが本当にZipf分布に従っていることを検証することです)。最近、プロジェクトのデザイナーと話をしなければなりません。
マウリツィオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.