Évaluer la puissance d'un test de normalité (en R)


9

Je veux évaluer l'exactitude des tests de normalité sur différentes tailles d'échantillon dans R (je me rends compte que les tests de normalité peuvent être trompeurs ). Par exemple, pour examiner le test de Shapiro-Wilk, je procède à la simulation suivante (ainsi que le traçage des résultats) et je m'attends à ce que la taille de l'échantillon augmente la probabilité de rejeter les diminutions nulles:

n <- 1000
pvalue_mat <- matrix(NA, ncol = 1, nrow = n)

for(i in 10:n){
    x1 <- rnorm(i, mean = 0, sd = 1)
    pvalue_mat[i,] <- shapiro.test(x1)$p.value
}   

plot(pvalue_mat)

À mon avis, à mesure que la taille de l'échantillon augmente, le taux de rejet devrait diminuer, mais il semble assez uniforme. Je pense que je comprends mal - toutes les pensées sont les bienvenues.


2
Vous voudrez peut-être jeter un œil à: stats.stackexchange.com/questions/2492/…
nico

Réponses:


7

Vous simulez sous l'hypothèse nulle (distribution normale), donc le taux de rejet tendra au niveau de signification comme prévu. Pour évaluer la puissance, vous devez simuler sous n'importe quelle distribution non normale. Il existe une infinité de possibilités / scénarios (par exemple, les distributions gamma avec une asymétrie croissante, la distribution t avec une df décroissante, etc.) parmi lesquelles choisir, selon la portée de votre étude.


Merci pour la réponse. Lorsque je simule sur des distributions non normales, j'observe un motif convexe par rapport à l'origine - c'est-à-dire que lorsque la taille de l'échantillon augmente pour toute distribution non normale, la probabilité de rejeter le zéro de normalité augmente. Cependant, je ne comprends pas pourquoi ce n'est pas l'inverse lors du dessin à partir d'une distribution normale: pourquoi la probabilité de rejeter la valeur nulle ne diminue-t-elle pas lorsque la taille de l'échantillon augmente? Merci
user94759

3
Parce que la probabilité de commettre une telle erreur de type 1 est par définition égale au niveau de signification, qui est constant. Autrement dit, les valeurs de p sont uniformément réparties sous le nul. De plus, il est conseillé de faire de nombreuses simulations par paramètre, y compris le choix de n, pas seulement un comme dans votre code.
Michael M

7

La compréhension de l'analyse de puissance des tests d'hypothèses statistiques peut être améliorée en effectuant certains et en regardant de près les résultats.


De par sa conception, un test de taille est destiné à rejeter l'hypothèse nulle avec une chance d'au moins lorsque le zéro est vrai (son taux de faux positifs attendu ). ααα Lorsque nous avons la capacité (ou le luxe) de choisir parmi des procédures alternatives avec cette propriété, nous préférerions celles qui (a) se rapprochent réellement du taux de faux positifs nominaux et (b) ont des chances relativement plus élevées de rejeter l'hypothèse nulle lorsqu'elle est pas vrai.

Le deuxième critère nous oblige à préciser de quelle (s) manière (s) et dans quelle mesure le nul ne se révèle pas vrai. Dans les cas de manuels, cela est facile, car les alternatives sont de portée limitée et clairement spécifiées. Avec des tests de distribution comme le Shapiro-Wilk, l'alternative est beaucoup plus vague: ils sont «non normaux». Lors du choix parmi les tests de distribution, l'analyste devra probablement mener sa propre étude de puissance ponctuelle pour évaluer dans quelle mesure les tests fonctionnent avec des hypothèses alternatives plus spécifiques qui sont préoccupantes dans le problème en question.

Un exemple motivé par la réponse de Michael Mayer postule que la distribution alternative peut avoir des qualités similaires à celles de la famille des distributions t de Student. Cette famille, paramétrée par un nombre (ainsi que par emplacement et échelle) inclut dans la limite des grands les distributions normales.ν1ν

Dans les deux situations - qu'il s'agisse d'évaluer la taille réelle du test ou sa puissance - nous devons générer des échantillons indépendants à partir d'une distribution spécifiée, exécuter le test sur chaque échantillon et trouver la vitesse à laquelle il rejette l'hypothèse nulle. Cependant, il y a plus d'informations disponibles dans n'importe quel résultat de test: sa valeur P. En conservant l'ensemble des valeurs de P produites lors d'une telle simulation, nous pouvons ultérieurement évaluer la vitesse à laquelle le test rejetterait la valeur nulle pour toute valeur de pourrait nous intéresser. Le cœur de l'analyse de puissance est donc un sous-programme qui génère cette distribution de valeur P (soit par simulation, comme nous venons de le décrire, soit - occasionnellement - avec une formule théorique). Voici un exemple codé . Ses arguments incluentαR

  • rdist, le nom d'une fonction pour produire un échantillon aléatoire à partir d'une distribution

  • n, la taille des échantillons à demander rdist

  • n.iter, le nombre de ces échantillons à obtenir

  • ..., tous les paramètres facultatifs à transmettre rdist(tels que les degrés de liberté ).ν

Les paramètres restants contrôlent l'affichage des résultats; ils sont inclus principalement pour faciliter la génération des chiffres dans cette réponse.

sim <- function(rdist, n, n.iter, prefix="",
                breaks=seq(0, 1, length.out=20), alpha=0.05,
                plot=TRUE, ...) {

  # The simulated P-values.
  # NB: The optional arguments "..." are passed to `rdist` to specify
  #     its parameters (if any).
  x <- apply(matrix(rdist(n*n.iter, ...), ncol=n.iter), 2, 
             function(y) shapiro.test(y)$p.value)

  # The histogram of P-values, if requested.
  if (plot) {
    power <- mean(x <= alpha)
    round.n <- 1+ceiling(log(1 + n.iter * power * (1-power), base=10) / 2)
    hist(x[x <= max(breaks)], xlab=paste("P value (n=", n, ")", sep=""), 
         breaks=breaks, 
         main=paste(prefix, "(power=", format(power, digits=round.n), ")", sep=""))
    # Specially color the "significant" part of the histogram
    hist(x[x <= alpha], breaks=breaks, col="#e0404080", add=TRUE)
  }

  # Return the array of P-values for any further processing.
  return(x)
}

Vous pouvez voir que le calcul ne prend en fait qu'une seule ligne; le reste du code trace l'histogramme. Pour l'illustrer, utilisons-le pour calculer les taux de faux positifs attendus. «Taux» est au pluriel car les propriétés d'un test varient généralement avec la taille de l'échantillon. Comme il est bien connu que les tests de distribution ont une puissance élevée par rapport à des alternatives qualitativement petites lorsque la taille des échantillons est grande, cette étude se concentre sur une gamme de petites tailles d'échantillon où ces tests sont souvent appliqués dans la pratique: généralement environ à Pour économiser le calcul temps, je ne signale que des valeurs de de à5100.n520.

n.iter <- 10^5                 # Number of samples to generate
n.spec <- c(5, 10, 20)         # Sample sizes to study
par(mfrow=c(1,length(n.spec))) # Organize subsequent plots into a tableau
system.time(
  invisible(sapply(n.spec, function(n) sim(rnorm, n, n.iter, prefix="DF = Inf ")))
)

Après avoir spécifié les paramètres, ce code n'est également qu'une seule ligne. Il donne la sortie suivante:

Histogrammes pour le nul

C'est l'apparence attendue: les histogrammes montrent des distributions presque uniformes des valeurs de P sur toute la plage de à . Avec la taille nominale fixée à les simulations indiquent entre et des valeurs P étaient en fait inférieures à ce seuil: ce sont les résultats surlignés en rouge. La proximité de ces fréquences à la valeur nominale atteste que le test de Shapiro-Wilk fonctionne comme annoncé.01α=0.05,.04810.0499

(Il semble y avoir une tendance vers une fréquence inhabituellement élevée de valeurs de P proches de Ceci est peu préoccupant, car dans presque toutes les applications, les seules valeurs de P que l'on examine sont ou moins.)10.2

Passons maintenant à l'évaluation de la puissance. La gamme complète des valeurs de pour la distribution de Student t peut être étudiée de manière adéquate en évaluant quelques exemples d'environ à . Comment le sais-je? J'ai effectué quelques essais préliminaires en utilisant un très petit nombre d'itérations (de à ), ce qui ne prend pas de temps du tout. Le code nécessite désormais une double boucle (et dans des situations plus complexes, nous avons souvent besoin de boucles triples ou quadruples pour s'adapter à tous les aspects dont nous devons varier): une pour étudier comment la puissance varie avec la taille de l'échantillon et une autre pour étudier comment elle varie avec les degrés de liberté. Encore une fois, cependant, tout se fait en une seule ligne de code (la troisième et dernière):νν=100ν=11001000

df.spec <- c(64, 16, 4, 2, 1)
par(mfrow=c(length(n.spec), length(df.spec)))
for (n in n.spec) 
  for (df in df.spec)
    tmp <- sim(rt, n, n.iter, prefix=paste("DF =", df, ""), df=df)

Histogrammes pour les alternatives

Une petite étude de ce tableau fournit une bonne intuition sur le pouvoir. Je voudrais attirer l'attention sur ses aspects les plus saillants et utiles:

  • À mesure que les degrés de liberté passent de à gauche à à droite, de plus en plus de valeurs P sont petites, ce qui montre que le pouvoir de discriminer ces distributions d'une distribution normale augmente. (La puissance est quantifiée dans chaque titre de tracé: elle est égale à la proportion de la zone de l'histogramme qui est rouge.)ν=64ν=1

  • À mesure que la taille de l'échantillon passe de sur la rangée du haut à sur le bas, la puissance augmente également.n=5n=20

  • Remarquez que, comme la distribution alternative diffère davantage de la distribution nulle et que la taille de l'échantillon augmente, les valeurs P commencent à se collecter vers la gauche, mais il y en a toujours une "queue" qui s'étend jusqu'à . Ceci est caractéristique des études de puissance. Cela montre que le test est un pari : même lorsque l'hypothèse nulle est violée de manière flagrante et même lorsque notre taille d'échantillon est raisonnablement grande, notre test formel peut ne pas produire de résultat significatif.1

  • Même dans le cas extrême en bas à droite, où un échantillon de est tiré d'une distribution de Student t avec degré de liberté (une distribution de Cauchy), la puissance n'est pas : il y a chance qu'un échantillon de iid variables de Cauchy ne sera pas considéré comme significativement différent de Normal à un niveau de (c'est-à-dire avec une confiance de ).201110086.57=13%205%95%

  • Nous pourrions évaluer la puissance à n'importe quelle valeur de nous choisissons en coloriant plus ou moins de barres sur ces histogrammes. Par exemple, pour évaluer la puissance à , coloriez les deux barres de gauche de chaque histogramme et estimez sa surface en fraction du total.αα=0.10

    (Cela ne fonctionnera pas trop bien pour des valeurs de inférieures à avec cette figure. En pratique, on limiterait les histogrammes aux valeurs P uniquement dans la plage qui serait utilisée, peut-être de à , et les montrer avec suffisamment de détails pour permettre une évaluation visuelle de la puissance jusqu'à ou même . (C'est à cela que sert l' option .) Le post-traitement des résultats de la simulation peut fournir encore plus de détails.)α0.05020%α=0.01α=0.005breakssim


Il est amusant de pouvoir en tirer autant de ce qui équivaut en fait à trois lignes de code: une pour simuler des échantillons iid d'une distribution spécifiée, une pour l'appliquer à un tableau de distributions nulles et la troisième pour l'appliquer à un tableau de distributions alternatives. Ce sont les trois étapes qui entrent dans toute analyse de puissance: le reste résume et interprète simplement les résultats.


1

(Plus qu'un commentaire, peut-être pas une réponse complète)

[Je] m'attendrais à ce qu'à mesure que la taille de l'échantillon augmente, la probabilité de rejeter la valeur nulle diminue

Laissant de côté les considérations de tests biaisés (qui ne sont pas rares dans la qualité de l'ajustement, il vaut donc la peine d'être mentionné), il y a trois situations relatives au taux de rejet que l'on pourrait envisager:

1) le taux de rejet lors de la simulation à partir du nul (comme vous semblez le faire dans votre question)

Ici, le taux de rejet doit être égal ou proche du niveau de signification, donc, non, si vous maintenez le niveau de signification constant, le taux de rejet ne diminue pas lorsque n augmente, mais reste à / près de .α

2) le taux de rejet lors de la simulation à partir d'une alternative

Ici, le taux de rejet devrait augmenter à mesure que n augmente.

3) le taux de rejet pour certaines collectes de données réelles

Pratiquement, la valeur nulle n'est jamais réellement vraie, et les données réelles auront un mélange de quantités de non-normalité (mesurées par la statistique de test). Si le degré de non-normalité n'est pas lié à la taille de l'échantillon, le taux de rejet devrait augmenter à mesure que n augmente.

En fait, dans aucune de ces situations, nous ne devrions voir le taux de rejet diminuer avec la taille de l'échantillon.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.