Rを使用してテストを実行し、データが正規分布に従うかどうかを確認する方法


44

次の構造のデータセットがあります。

a word | number of occurrence of a word in a document | a document id 

Rで正規分布のテストを実行するにはどうすればよいですか?おそらく簡単な質問ですが、私はR初心者です。


5
@Skarab多分完全にオフになっているかもしれませんが、Zipfの法則(j.mp/9er2lv)に従って、単語の頻度が単語の頻度表のランクに反比例するとは思わないでしょうか?この場合、zipfRパッケージをチェックアウトします。
chl

1
私は@chlに同意します-あなたのデータが正常に配布された場合、それは小さな奇跡になるでしょう。おそらく、データで何をしたいのかについての別の質問は価値があります。車輪を再発明しないでください!
csgillespie

3
負の発生にゼロ以外の確率を与えるモデルに従って、データをどのように分散できますか?
user603

1
このテストを行う理由は何ですか?
whuber

情報抽出の膨大な結果が正しいかどうかを推定したいと思います。テキストで見つかったエンティティの分布が私の予想に従っているかどうかを確認したい(ドメインとテキストコーパスを知っている)。
スカラブ

回答:


47

あなたの質問を正しく理解したら、一連の文書内の単語の出現が正規分布に従っているかどうかをテストするには、shapiro-Wilkテストといくつかのqqplotを使用するだけです。例えば、

## Generate two data sets
## First Normal, second from a t-distribution
words1 = rnorm(100); words2 = rt(100, df=3)

## Have a look at the densities
plot(density(words1));plot(density(words2))

## Perform the test
shapiro.test(words1); shapiro.test(words2)

## Plot using a qqplot
qqnorm(words1);qqline(words1, col = 2)
qqnorm(words2);qqline(words2, col = 2)

qqplotコマンドは以下を提供します。 代替テキスト

2番目のデータセットは、太い尾によって明らかにノーマルではないことがわかります(詳細)。

Shapiro-Walk正規性検定では、p値は最初のデータセットでは大きく(> .9)、2番目のデータセットでは非常に小さい(<.01)。これにより、2番目の帰無仮説を棄却することになります。


7
なぜ明らかに正常ではないのですか?
ハーマン歯磨き

プロットされた点は、I-III象限二等分線上にあり、正規分布を描くのと同じくらい近いはずです。
カンパ

より一般的には(平均!= 0)、qqline1つのスロープとmuインターセプトが必要です。
カンパ

@HermanToothrot 2番目のプロットを見ると、尾の値に非常に大きな相違があるため、正常ではありません。QQプロットは、(データからの)理論量(サンプルが正常である場合)とサンプル量のグラフです。サンプルデータが正常である場合、最初のプロットのように、観測値がラインに近いと予想されます。また、これらのプロットのy軸のスケールの違いにも注意してください。
シェルドン

15

データセットが呼び出されwordscounts列があると仮定すると、ヒストグラムをプロットして分布を視覚化できます。

hist(words$counts, 100, col="black")

ここで、100はビンの数です

を使用して通常のQQプロットを行うこともできます

qqnorm(words$counts)

最後に、Shapiro-Wilkテストを使用して正常性を確認することもできます

shapiro.test(word$counts)

ただし、この議論を見てください:正常性テスト:「本質的に役に立たない?」


14

データ正規分布あることをテストで示すことはできません。データ正規分布と十分に矛盾していて、nullを拒否する場合にのみ表示できます。

しかし、カウントはどのような場合でも正規ではありません、それらは正の整数です-正規分布からの観測値が整数ではない値を取る確率はどれくらいですか?(...それは確率1のイベントです)。

この場合、なぜ正常性をテストするのですか?それは明らかに真実ではありません。

[場合によっては、データが実際に正常ではないことを伝えることができることは必ずしも重要ではないかもしれません。実際のデータは、正規分布から実際に引き出されることはありません(ほとんどありません)。]

本当にテストを行う必要がある場合、Shapiro-Wilkテスト(?shapiro.test)は正常性の一般的なテストであり、広く使用されています。


9

正規性を調べるより正式な方法は、尖度と歪度がゼロと有意に異なるかどうかをテストすることです。

これを行うには、以下を取得する必要があります。

kurtosis.test <- function (x) {
m4 <- sum((x-mean(x))^4)/length(x)
s4 <- var(x)^2
kurt <- (m4/s4) - 3
sek <- sqrt(24/length(x))
totest <- kurt/sek
pvalue <- pt(totest,(length(x)-1))
pvalue 
}

尖度、および:

skew.test <- function (x) {
m3 <- sum((x-mean(x))^3)/length(x)
s3 <- sqrt(var(x))^3
skew <- m3/s3
ses <- sqrt(6/length(x))
totest <- skew/ses
pt(totest,(length(x)-1))
pval <- pt(totest,(length(x)-1))
pval
}

スキューネス用。

これらの検定は両方とも片側なので、p値に2を掛けて両側にする必要があります。p値が1より大きくなった場合、kurtosis.testの代わりに1-kurtosis.test()を使用する必要があります。

他にご質問がある場合は、j.bredman @ gmail.comまでメールでお問い合わせください。


上記の2つの関数の違い、どのようなものkurtosis()skewness()から機能をモーメントパッケージ?rnorm()サンプルを使用した結果は異なります。
ニコスアレクサン

5

statsパッケージのShapiro-Wilkテストに加えて、nortestパッケージ(CRANで利用可能)は他の正常性テストを提供します。


4

nortestR のパッケージを使用すると、次のテストを実行できます。

  • アンダーソンダーリング正規性検定を実行します

    ad.test(data1)
  • 正規性についてCramér-vonMises検定を実行します

    cvm.test(data1)
  • 正規性のピアソンカイ二乗検定を実行

    pearson.test(data1)
  • 正常性についてShapiro-Franciaテストを実行します

    sf.test(data1)

normtestパッケージを使用して、他の多くのテストを実行できます。https://cran.r-project.org/web/packages/normtest/normtest.pdfの説明を参照して ください


@Nick; ここにある「nortest パッケージからこれらのテストに言及しました:(cran.r-project.org/web/packages/nortest/nortest.pdf)。他の便利なパッケージは、上記の「normtest」です。
ニシャアローラ博士

はい、ありがとう。私の無知において、私は一つの名前がタイプミスであると仮定しました。
ニックコックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.