it-swarm-id.com

Melihat apakah data terdistribusi secara normal dalam R

Dapatkah seseorang tolong bantu saya mengisi fungsi berikut di R:

#data is a single vector of decimal values
normally.distributed <- function(data) {
if(data is normal)
return(TRUE)
else
return(NO)
}
53
CodeGuy

Tes normalitas tidak melakukan apa yang kebanyakan orang pikirkan. Tes Shapiro, Anderson Darling, dan lainnya adalah tes hipotesis nol MELAWAN asumsi normalitas. Ini tidak boleh digunakan untuk menentukan apakah akan menggunakan prosedur statistik teori normal. Bahkan mereka hampir tidak ada nilainya bagi analis data. Dalam kondisi apa kita tertarik untuk menolak hipotesis nol bahwa data terdistribusi secara normal? Saya belum pernah menemukan situasi di mana tes normal adalah hal yang benar untuk dilakukan. Ketika ukuran sampel kecil, bahkan keberangkatan besar dari normalitas tidak terdeteksi, dan ketika ukuran sampel Anda besar, bahkan penyimpangan terkecil dari normalitas akan menyebabkan nol ditolak.

Sebagai contoh:

> set.seed(100)
> x <- rbinom(15,5,.6)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.8816, p-value = 0.0502

> x <- rlnorm(20,0,.4)
> shapiro.test(x)

    Shapiro-Wilk normality test

data:  x 
W = 0.9405, p-value = 0.2453

Jadi, dalam kedua kasus ini (varian binomial dan lognormal) nilai-p> 0,05 menyebabkan kegagalan untuk menolak nol (bahwa datanya normal). Apakah ini berarti kita harus menyimpulkan bahwa data itu normal? (petunjuk: jawabannya tidak). Kegagalan untuk menolak tidak sama dengan menerima. Ini adalah pengujian hipotesis 101. 

Tapi bagaimana dengan ukuran sampel yang lebih besar? Mari kita ambil kasus di mana distribusinya sangat hampir normal.

> library(nortest)
> x <- rt(500000,200)
> ad.test(x)

    Anderson-Darling normality test

data:  x 
A = 1.1003, p-value = 0.006975

> qqnorm(x)

enter image description hereenter image description here

Di sini kita menggunakan distribusi-t dengan 200 derajat kebebasan. Plot qq menunjukkan distribusi lebih dekat ke normal daripada distribusi yang mungkin Anda lihat di dunia nyata, tetapi tes menolak normalitas dengan tingkat kepercayaan yang sangat tinggi.

Apakah uji signifikan terhadap normalitas berarti bahwa kita tidak boleh menggunakan statistik teori normal dalam kasus ini? (petunjuk lain: jawabannya tidak :))

175
Ian Fellows

Saya juga sangat merekomendasikan SnowsPenultimateNormalityTest dalam paket TeachingDemos. Dokumentasi fungsi jauh lebih berguna bagi Anda daripada tes itu sendiri. Baca dengan seksama sebelum menggunakan tes.

22
Brian Diggs

SnowsPenultimateNormalityTest tentu memiliki kelebihannya, tetapi Anda mungkin juga ingin melihat qqnorm.

X <- rlnorm(100)
qqnorm(X)
qqnorm(rnorm(100))
12
42-

Pertimbangkan untuk menggunakan fungsi shapiro.test , yang melakukan uji Shapiro-Wilks untuk normalitas. Saya senang dengan itu.

4
Karl

perpustakaan (DnE)

x <-rnorm (1000,0,1)

is.norm (x, 10,0.05)

2
yuki

Tes Anderson-Darling juga bermanfaat.

library(nortest)
ad.test(data)
1
P Sellaz

ketika Anda melakukan tes, Anda pernah memiliki kemungkinan untuk menolak hipotesis nol ketika itu benar.

Lihat kode R selanjutnya:

p=function(n){
  x=rnorm(n,0,1)
  s=shapiro.test(x)
  s$p.value
}

rep1=replicate(1000,p(5))
rep2=replicate(1000,p(100))
plot(density(rep1))
lines(density(rep2),col="blue")
abline(v=0.05,lty=3)

Grafik menunjukkan bahwa apakah Anda memiliki ukuran sampel kecil atau besar 5% dari waktu Anda memiliki kesempatan untuk menolak hipotesis nol ketika itu benar (kesalahan Tipe-I)

0
user5807327

Selain qqplot dan tes Shapiro-Wilk, metode berikut mungkin berguna.

Kualitatif:

  • histogram dibandingkan dengan normal
  • cdf dibandingkan dengan normal
  • plot ggdensity
  • ggqqplot

Kuantitatif:

Metode kualitatif dapat diproduksi menggunakan yang berikut ini di R:

library("ggpubr")
library("car")

h <- hist(data, breaks = 10, density = 10, col = "darkgray") 
xfit <- seq(min(data), max(data), length = 40) 
yfit <- dnorm(xfit, mean = mean(data), sd = sd(data)) 
yfit <- yfit * diff(h$mids[1:2]) * length(data) 
lines(xfit, yfit, col = "black", lwd = 2)

plot(ecdf(data), main="CDF")
lines(ecdf(rnorm(10000)),col="red")

ggdensity(data)

ggqqplot(data)

Sebuah kata peringatan - jangan membabi buta menerapkan tes. Memiliki pemahaman yang kuat tentang statistik akan membantu Anda memahami kapan harus menggunakan tes mana dan pentingnya asumsi dalam pengujian hipotesis.

0
Anna