J'ai des données de 3 groupes de biomasse d'algues ( , , ) qui contiennent des tailles d'échantillon inégales ( , , ) et j'aimerais comparer si ces groupes appartiennent à la même population.B C n A = 15 n B = 13 n C = 12
Une ANOVA à un facteur serait définitivement la solution, cependant, lors de tests de normalité de mes données, l'hétéroskédascité semble être le problème principal. Mes données brutes, sans aucune transformation, ont produit un rapport de variances ( ) très supérieur à la valeur critique ( F _ {\ rm crit} = 4.16 ) et ne permettaient donc pas d'effectuer une ANOVA à un facteur. .
J'ai aussi essayé la transformation pour normaliser mes données. Même après des essais de diverses transformations (log, racine carrée, carré), le F _ {\ max} le plus bas produit après transformation avec une transformation était de , ce qui était encore plus élevé par rapport à .
Est-ce que quelqu'un ici peut me conseiller sur où aller d'ici? Je ne peux pas penser à d'autres méthodes de transformation pour normaliser par les données. Existe-t-il des alternatives à l'ANOVA à sens unique?
PS: mes données brutes sont ci-dessous:
A: 0.178 0.195 0.225 0.294 0.315 0.341 0.36 0.363 0.371 0.398 0.407 0.409 0.432
0.494 0.719
B: 0.11 0.111 0.204 0.416 0.417 0.441 0.492 0.965 1.113 1.19 1.233 1.505 1.897
C: 0.106 0.114 0.143 0.435 0.448 0.51 0.576 0.588 0.608 0.64 0.658 0.788 0.958
Réponses:
Un certain nombre d'options sont disponibles pour traiter des données hétéroscédastiques. Malheureusement, aucun d’entre eux n’est garanti de toujours fonctionner. Voici quelques options que je connais bien:
Mise à jour: Voici une démonstration
R
de quelques manières d’ajuster un modèle linéaire (c’est-à-dire une ANOVA ou une régression) lorsque vous avez une hétéroscédasticité / hétérogénéité de la variance.Commençons par examiner vos données. Pour plus de commodité, je les ai chargés dans deux trames de données appelées
my.data
(qui sont structurées comme ci-dessus avec une colonne par groupe) etstacked.data
qui ont deux colonnes:values
avec les nombres etind
avec l'indicateur de groupe).Nous pouvons formellement tester l' hétéroscédasticité avec le test de Levene:
Effectivement, vous avez l'hétéroscédasticité. Nous allons vérifier quels sont les écarts des groupes. En règle générale, les modèles linéaires sont assez robustes face à l'hétérogénéité de la variance tant que la variance maximale n'est pas supérieure à supérieure à la variance minimale. Nous allons donc trouver ce rapport également:4×
Vos écarts diffèrent considérablement, le plus grand19×
B
étant le plus petit . C'est un niveau problématique d'hétéroscedsaticité.A
Vous aviez pensé à utiliser des transformations telles que le log ou la racine carrée pour stabiliser la variance. Cela fonctionnera dans certains cas, mais les transformations de type Box-Cox stabilisent la variance en comprimant les données de manière asymétrique, soit en les comprimant vers le bas, les données les plus élevées étant comprimées au maximum, soit en les resserrant vers le haut avec les données les plus basses. Ainsi, vous avez besoin que la variance de vos données change avec la moyenne pour que cela fonctionne de manière optimale. Vos données présentent une différence de variance énorme, mais une différence relativement faible entre les moyennes et les médianes, c’est-à-dire que les distributions se chevauchent généralement. En tant qu’exercice d’enseignement, nous pouvons en créer2,7 .7
parallel.universe.data
en ajoutant à toutes les valeurs et à.7B
C
est de montrer comment cela fonctionnerait:L'utilisation de la transformation de racine carrée stabilise assez bien ces données. Vous pouvez voir l'amélioration des données de l'univers parallèle ici:
Plutôt que d'essayer différentes transformations, une approche plus systématique consiste à optimiser le paramètre Box-Cox (bien qu'il soit généralement recommandé de l'arrondir à la transformation interprétable la plus proche). Dans votre cas, la racine carrée, , ou le journal, , sont acceptables, mais aucun ne fonctionne réellement. Pour les données de l'univers parallèle, la racine carrée est la meilleure:λ λ = 0λ = .5 λ = 0
Puisque ce cas est une ANOVA (c'est-à-dire aucune variable continue), une solution pour traiter l'hétérogénéité consiste à utiliser la correction de Welch au degré de liberté du dénominateur dans le test (nb , une valeur fractionnelle plutôt que ):F
df = 19.445
df = 38
Une approche plus générale consiste à utiliser les moindres carrés pondérés . Certains groupes (
B
) s'étalant davantage, les données de ces groupes fournissent moins d'informations sur l'emplacement de la moyenne que les données des autres groupes. Nous pouvons laisser le modèle incorporer cela en fournissant un poids avec chaque point de données. Un système commun consiste à utiliser l'inverse de la variance de groupe comme pondération:Cela donne des valeurs et légèrement différentes de celles de l'ANOVA non pondérée ( , ), mais cela a bien résolu l'hétérogénéité: pF p
4.5089
0.01749
Les moindres carrés pondérés ne constituent toutefois pas une panacée. Un fait inconfortable est que ce n'est que juste si les poids sont juste, ce qui signifie, entre autres choses, qu'ils sont connus a priori. Il ne traite pas non plus de la non-normalité (telle que l'asymétrie) ni des valeurs aberrantes. L’utilisation de pondérations estimées à partir de vos données fonctionne généralement bien, en particulier si vous disposez de suffisamment de données pour estimer la variance avec une précision raisonnable (cette méthode est analogue à l’idée d’utiliser une table au lieu d’une table lorsque vous avez ou plus).t 50 100 Nz t 50 100 degrés de liberté), vos données sont suffisamment normales et vous ne semblez pas avoir de données aberrantes. Malheureusement, vous avez relativement peu de données (13 ou 15 par groupe), quelques biais et peut-être des valeurs aberrantes. Je ne suis pas sûr que ce soit assez grave pour en faire une grosse affaire, mais vous pouvez mélanger les moindres carrés pondérés à des méthodes robustes . Au lieu d'utiliser la variance comme mesure de la dispersion (sensible aux valeurs aberrantes, en particulier avec un faible ), vous pouvez utiliser l'inverse de la plage inter-quartile (non affectée par des valeurs aberrantes pouvant aller jusqu'à 50% dans chaque groupe). Ces poids pourraient ensuite être combinés avec une régression robuste en utilisant une fonction de perte différente comme celle de Tukey's bisquare: N
Les poids ici ne sont pas aussi extrêmes. Les moyennes des groupes prédites diffèrent légèrement (
A
: WLS0.36673
, robuste0.35722
;B
: WLS0.77646
, robuste0.70433
;C
: WLS0.50554
, solide0.51845
), avec les moyens deB
etC
étant moins tirés par des valeurs extrêmes.En économétrie, l' erreur type de Huber-White ("sandwich") est très populaire. À l'instar de la correction de Welch, cela ne vous oblige pas à connaître les variances a priori ni à estimer les poids à partir de vos données et / ou à condition d'utiliser un modèle qui pourrait ne pas être correct. D'autre part, je ne sais pas comment incorporer cela dans une ANOVA, ce qui signifie que vous ne les obtenez que pour les tests de codes factices individuels, ce qui me semble moins utile dans ce cas, mais je vais vous en faire la démonstration:
La fonctiont t t
vcovHC
calcule une matrice de variance-covariance cohérente hétéroscedastique pour vos betas (codes factices), ce que signifient les lettres de l'appel de fonction. Pour obtenir des erreurs types, vous extrayez la diagonale principale et prenez les racines carrées. Pour obtenir des tests pour vos bêta, vous divisez vos estimations de coefficient par les SE et comparez les résultats à la distribution appropriée (à savoir, la distribution avec vos degrés de liberté restants). t tPour lesp
R
utilisateurs en particulier, @TomWenseleers note dans les commentaires ci-dessous que la fonction ? Anova ducar
package peut accepter unwhite.adjust
argument pour obtenir une valeur pour le facteur en utilisant des erreurs cohérentes d'hétéroscédasticité.Vous pouvez essayer d'obtenir une estimation empirique de la répartition réelle de votre statistique de test en procédant par bootstrap . Tout d'abord, vous créez un vrai null en faisant en sorte que tous les groupes soient exactement égaux. Ensuite, vous rééchantillonnez avec remplacement et calculez votre statistique de test ( ) sur chaque échantillon pour obtenir une estimation empirique de la distribution d'échantillonnage de sous le zéro avec vos données, quel que soit leur statut en termes de normalité ou d'homogénéité. La proportion de cette distribution d'échantillonnage aussi extrême ou plus extrême que votre statistique de test observée correspond à la valeur : F pF F p
À certains égards, l’amorçage est l’approche ultime en matière d’hypothèses réduites pour analyser les paramètres (par exemple, les moyennes), mais cela suppose que vos données représentent bien la population, ce qui signifie que vous disposez d’une taille d’échantillon raisonnable. Étant donné que vos sont petits, il est peut-être moins fiable. La protection ultime contre la non-normalité et l'hétérogénéité consiste probablement à utiliser un test non paramétrique. La version non paramétrique de base d'une ANOVA est le test de Kruskal-Wallis :n
Bien que le test de Kruskal-Wallis soit sans aucun doute la meilleure protection contre les erreurs de type I, il ne peut être utilisé qu’avec une seule variable catégorique (c’est-à-dire qu’il n’ya pas de prédicteurs continus ni de conceptions factorielles) et qu’il a le moins de pouvoir de toutes les stratégies examinées. Une autre approche non paramétrique consiste à utiliser la régression logistique ordinale . Cela semble étrange à beaucoup de gens, mais vous devez seulement supposer que vos données de réponse contiennent des informations ordinales légitimes, ce qu'ils font sûrement ou bien toute autre stratégie ci-dessus est également invalide:
chi2
Discrimination Indexes
0.0363
la source
car
il existe également une option permettantwhite.adjust=T
de régler l’hétéroskédacité à l’aide d’erreurs standard corrigées en fonction de l’hétéroscédasticité ajustée en fonction du blanclm
« s, mais il semble aussi travailler pouraov
l » (options pourwhite.adjust
sontwhite.adjust=c(FALSE, TRUE, "hc3", "hc0", "hc1", "hc2", "hc4")
- pour plus d' informations voir?hccm
)