web-dev-qa-db-fra.com

Voir si les données sont normalement distribuées dans R

Quelqu'un peut-il m'aider s'il vous plaît à remplir la fonction suivante dans R:

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

Les tests de normalité ne font pas ce que la plupart pensent faire. Le test de Shapiro, Anderson Darling, et d’autres sont des tests d’hypothèses nuls CONTRE la supposition de normalité. Celles-ci ne doivent pas être utilisées pour déterminer s'il convient d'utiliser des procédures statistiques normales. En fait, ils n’ont pratiquement aucune valeur pour l’analyste de données. Dans quelles conditions sommes-nous intéressés à rejeter l'hypothèse nulle selon laquelle les données sont normalement distribuées? Je n'ai jamais rencontré de situation où un test normal est la bonne chose à faire. Lorsque la taille de l'échantillon est petite, même les écarts importants par rapport à la normalité ne sont pas détectés et lorsque la taille de votre échantillon est grande, même le plus petit écart par rapport à la normalité conduit à un rejet nul.

Par exemple:

> 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

Ainsi, dans ces deux cas (variables binomiales et log-normales), la valeur p est> 0,05, ce qui empêche le rejet de la valeur NULL (les données sont normales). Cela signifie-t-il que nous devons conclure que les données sont normales? (indice: la réponse est non). Ne pas rejeter n'est pas la même chose qu'accepter. Ceci est un test d'hypothèse 101. 

Mais qu'en est-il des échantillons plus grands? Prenons le cas où la distribution est très presque normale.

> 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

Nous utilisons ici une distribution en T avec 200 degrés de liberté. Le graphique qq montre que la distribution est plus proche de la normale que toute distribution que vous êtes susceptible de voir dans le monde réel, mais le test rejette la normalité avec un très haut degré de confiance.

Le test significatif contre la normalité signifie-t-il que nous ne devrions pas utiliser les statistiques théoriques normales dans ce cas? (autre indice: la réponse est non :))

175
Ian Fellows

Je recommanderais aussi fortement la SnowsPenultimateNormalityTest dans le paquet TeachingDemos. La documentation de la fonction vous est toutefois beaucoup plus utile que le test lui-même. Lisez-le attentivement avant d'utiliser le test.

22
Brian Diggs

SnowsPenultimateNormalityTest a certes ses vertus, mais vous pouvez aussi vouloir regarder qqnorm.

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

Pensez à utiliser la fonction shapiro.test , qui effectue le test de Shapiro-Wilks pour la normalité. J'ai été heureux avec ça.

4
Karl

bibliothèque (DnE)

x <-rnorm (1000,0,1)

is.norm (x, 10,0.05)

2
yuki

Le test Anderson-Darling est également utile.

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

lorsque vous effectuez un test, vous avez toujours la probabilité de rejeter l'hypothèse nulle lorsqu'elle est vraie.

Voir le code suivant:

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)

Le graphique montre que si vous avez une taille d’échantillon petite ou grande 5 fois sur 5, vous avez une chance de rejeter l’hypothèse nulle lorsqu'elle est vraie (erreur de type I)

0
user5807327

En plus des qqtrots et du test de Shapiro-Wilk, les méthodes suivantes peuvent être utiles.

Qualitatif:

  • histogramme par rapport à la normale
  • cdf par rapport à la normale
  • graphique de densité
  • ggqqplot

Quantitatif:

Les méthodes qualitives peuvent être produites en utilisant les éléments suivants dans 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)

Un mot d'avertissement - n'appliquez pas aveuglément des tests. Avoir une solide compréhension des statistiques vous aidera à comprendre quand utiliser quels tests et l'importance des hypothèses dans les tests d'hypothèses.

0
Anna