Comment tester si la variance de deux distributions est différente si les distributions ne sont pas normales

8

J'étudie deux populations géographiquement isolées de la même espèce. En examinant les distributions, je vois que les deux sont bimodales (il y a une certaine saisonnalité dans leur occurrence), mais les pics dans une population sont beaucoup plus élevés et beaucoup plus étroits (c'est-à-dire que la variance des pics locaux est plus petite).

Quel type de test statistique serait approprié pour déterminer si ces différences sont significatives?

Pour clarifier, mon axe y est le nombre d'individus identifiés dans un piège un jour particulier, et l'axe x est le jour julien.

Atticus29
la source
Vous pouvez essayer de faire une détection des valeurs aberrantes. en.wikipedia.org/wiki/Outlier .
Pouvez-vous écrire un modèle statistique? En outre, il existe de nombreuses façons différentes de spécifier «les variances ne sont pas égales» et «les variances sont égales» et votre conclusion peut très bien dépendre des choix particuliers que vous faites, surtout s'il s'agit d'une différence subtile. Il est donc préférable d'utiliser un modèle choisi par vous plutôt que celui choisi par quelqu'un sans contexte.
probabilitéislogic
1
C'est les deux! Vous avez une série chronologique de dénombrements.
whuber
1
Il serait extrêmement utile d'avoir un modèle, ou du moins une théorie suggestive, qui tente d'expliquer pourquoi certains pics seraient plus étroits et d'autres plus larges. Parce que vous êtes intéressé par les largeurs de ces pics, vous devez avoir au moins un modèle conceptuel , sinon quantitatif. Quels mécanismes pensez-vous produire de tels pics et régir leurs largeurs? Avez-vous des informations indépendantes qui suggèrent quand les pics devraient se produire? (Cela réduit l'incertitude dans l'identification des pics.) Les pics se produisent-ils en même temps ou à des moments différents?
whuber
2
@whuber, les pics des deux populations sont presque contemporains. L'un est sous les latitudes tempérées et l'autre sous les latitudes tropicales. Notre hypothèse est que la population tropicale a une niche écologique plus étroite que la population tempérée (c'est-à-dire qu'un plus grand nombre de prédateurs et d'agents pathogènes pousse la population à une période d'émergence étroite). Est ce que ça aide?
Atticus29

Réponses:

3

Ces distributions sont-elles quelque chose au fil du temps? Ça compte, peut-être? (Si c'est le cas, vous pourriez avoir besoin de quelque chose de très différent des discussions ici jusqu'à présent)

Ce que vous décrivez ne semble pas être très bien perçu comme une différence de variance des distributions.

On dirait que vous décrivez quelque chose de vaguement comme ça (ignorez les chiffres sur les axes, c'est juste pour donner une idée du type général de modèle que vous semblez décrire):

pics bimodaux

Si c'est vrai, alors considérez:

Alors que la largeur de chaque pic autour des centres locaux est plus étroite pour la courbe bleue, la variance des distributions rouge et bleue ne diffère guère dans l'ensemble.

Si vous identifiez au préalable les modes et les antimodes, vous pourrez alors mesurer la variabilité locale.

Glen_b -Reinstate Monica
la source
c'est exactement ma question. Merci! Alors, restreindre ma plage d'axes X pour englober, disons, uniquement le premier pic, puis effectuer ... un test F ?? ... serait la meilleure approche?
Atticus29
Vous ne voudriez probablement pas faire spécifiquement un test F pour les variances, je pense, pour deux raisons (si vous testez la variance de cette manière, @fileunderwater a mentionné quelques alternatives au test F). Mais avant d'aller aussi loin, pourriez-vous répondre aux deux questions en haut de mon message? Cette répartition des dénombrements est-elle dans le temps?
Glen_b -Reinstate Monica
ils le sont (voir les modifications apportées à la question).
Atticus29
avec les nouvelles informations et par mon commentaire à la réponse de fileunderwater ci-dessus, avez-vous des suggestions?
Atticus29
1
Il semble qu'il y ait une confusion considérable dans la question et ces commentaires sur ce qu'est un "écart". Dans les exemples de Glen_b, les données bleues présentent des écarts plus importants que les données rouges autour des deux pics apparents (près de x = 10 et x = 17), car les données bleues oscillent davantage entre les valeurs basses et hautes (qui sont tracées sur l'axe vertical, pas l'horizontale, qui représente apparemment le temps ).
whuber
3

Tout d'abord, je pense que vous devriez considérer les distributions saisonnières séparément, car la distribution bimodale est probablement le résultat de deux processus assez distincts. Les deux distributions pourraient être contrôlées par des mécanismes différents, de sorte que, par exemple, les distributions hivernales pourraient être plus sensibles au climat annuel. Si vous voulez examiner les différences de population et les raisons de celles-ci, je pense qu'il est donc plus utile d'étudier séparément les répartitions saisonnières.

En ce qui concerne un test, vous pouvez essayer le test de Levine (essentiellement un test d'homoscédasticité), qui est utilisé pour comparer les variances entre les groupes. Le test de Bartlett est une alternative, mais le test de Levene est censé être plus robuste à la non-normalité (en particulier lors de l'utilisation de la médiane pour les tests). Dans R, les tests de Levene et Bartlett se trouvent dans library(car).

fileunderwater
la source
Je regarde le test de Levene en R (je l'ai trouvé dans la bibliothèque "car"). Il semble qu'il ne prenne qu'un objet de modèle linéaire comme argument. Cela n'a pas vraiment de sens dans mon cas, car je veux juste comparer la variance de deux distributions (ne pas les analyser avec des modèles linéaires et valider ces hypothèses). Aucun conseil?
Atticus29
1
@ Atticus29 Oui, c'est en voiture - mon erreur. Cependant, il n'est pas basé sur un modèle linéaire strict - vous pouvez l'utiliser leveneTest(y ~ as.factor(group), data= datafile)pour un test de différence de variance entre les groupes, et si vous utilisez l'option `center =" médiane ", il est plus robuste à la non-normalité. Strictement, je pense que son test appelé Brown-Forsythe est basé sur la médiane.
fileunderwater
Ok, donc, question stupide, mais j'ai deux colonnes de données qui sont des dénombrements d'individus d'une espèce particulière capturés dans des pièges. Ces deux colonnes représentent les dénombrements de la même espèce les mêmes jours à différents endroits. Je ne sais pas comment les regrouper en utilisant l'emplacement sans perdre les informations de date en utilisant le format ci-dessus, si cela a du sens ....
Atticus29
@ Atticus Pouvez-vous inclure des exemples de données à votre question (y compris toutes les colonnes et les variables de classification)? Cela aiderait à clarifier une partie de la confusion sur le type exact de données dont vous disposez (voir par exemple les commentaires de @whuber). Mon sentiment était que vous aviez regroupé tous les enregistrements d'espèces de deux saisons, mais maintenant quand je relis votre Q, cela ne semble pas être le cas, et je ne suis pas sûr que ma solution soit appropriée. Avez-vous seulement des pièges à deux endroits et comptez-les quotidiennement (?) Dans le temps (pour une seule année)?
fileunderwater
[cnd] ... À quoi pensez-vous que le pic de fin de saison est dû; une deuxième génération dans la même année (quels taxons étudiez-vous?) ou deux phénotypes différents? @ Atticus29
fileunderwater
2

Je suis d'accord avec ce que d'autres ont dit - à savoir que "variance" est probablement le mauvais mot à utiliser (vu que la fonction que vous envisagez n'est pas une distribution de probabilité mais une série chronologique).

Je pense que vous voudrez peut-être aborder ce problème sous un angle différent - il suffit d'adapter les deux séries temporelles avec des courbes BASSE. Vous pouvez calculer des intervalles de confiance à 95% et commenter qualitativement leurs formes. Je ne suis pas sûr que vous ayez besoin de faire quelque chose de plus sophistiqué que cela.

J'ai écrit du code MATLAB ci-dessous pour illustrer ce que je dis. Je suis un peu pressé mais je pourrai bientôt apporter des clarifications. Une grande partie de ce que j'ai fait peut être prise directement à partir d'ici: http://blogs.mathworks.com/loren/2011/01/13/data-driven-fitting/

%% Generate Example data
npts = 200;
x = linspace(1,100,npts)';
y1 = (1e3*exp(-(x-25).^2/20) + 5e2*exp(-(x-65).^2/40));
y1_noisy = 50*randn(npts,1) + y1;
y2 = (1e3*exp(-(x-25).^2/60) + 5e2*exp(-(x-65).^2/100));
y2_noisy = 50*randn(npts,1) + y2;

figure; hold on
plot(x,y1_noisy,'ob')
plot(x,y2_noisy,'or')
title('raw data'); ylabel('count'); xlabel('time')
legend('y1','y2')

Vous voudrez peut-être normaliser les deux séries chronologiques pour comparer leurs tendances relatives plutôt que leurs niveaux absolus.

%% Normalize data sets
figure; hold on
Y1 = y1_noisy./norm(y1_noisy);
Y2 = y2_noisy./norm(y2_noisy);
plot(x,Y1,'ob')
plot(x,Y2,'or')
title('normalized data'); ylabel('normalized count'); xlabel('time')
legend('Y1','Y2')

Maintenant, faites des ajustements LOWESS ...

%% Make figure with lowess fits
figure; hold on
plot(x,Y1,'o','Color',[0.5 0.5 1])
plot(x,Y2,'o','Color',[1 0.5 0.5])
plot(x,mylowess([x,Y1],x,0.15),'-b','LineWidth',2)
plot(x,mylowess([x,Y2],x,0.15),'-r','LineWidth',2)
title('fit data'); ylabel('normalized count'); xlabel('time')

entrez la description de l'image ici

Enfin, vous pouvez créer des bandes de confiance à 95% comme suit:

%% Use Bootstrapping to determine 95% confidence bands
figure; hold on
plot(x,Y1,'o','Color',[0.75 0.75 1])
plot(x,Y2,'o','Color',[1 0.75 0.75])

f = @(xy) mylowess(xy,x,0.15);
yboot_1 = bootstrp(1000,f,[x,Y1])';
yboot_2 = bootstrp(1000,f,[x,Y2])';
meanloess(:,1) = mean(yboot_1,2);
meanloess(:,2) = mean(yboot_2,2);
upper(:,1) = quantile(yboot_1,0.975,2);
upper(:,2) = quantile(yboot_2,0.975,2);
lower(:,1) = quantile(yboot_1,0.025,2);
lower(:,2) = quantile(yboot_2,0.025,2);

plot(x,meanloess(:,1),'-b','LineWidth',2);
plot(x,meanloess(:,2),'-r','LineWidth',2);
plot(x,upper(:,1),':b');
plot(x,upper(:,2),':r');
plot(x,lower(:,1),':b');
plot(x,lower(:,2),':r');
title('fit data -- with confidence bands'); ylabel('normalized count'); xlabel('time')

Vous pouvez maintenant interpréter le chiffre final comme vous le souhaitez, et vous avez les ajustements LOWESS pour confirmer votre hypothèse selon laquelle les pics dans la courbe rouge sont en fait plus larges que la courbe bleue. Si vous avez une meilleure idée de la fonction, vous pouvez effectuer une régression non linéaire à la place.

Modifier: Sur la base de quelques commentaires utiles ci-dessous, j'ajoute plus de détails sur l'estimation explicite des largeurs de pic. Tout d'abord, vous devez trouver une définition de ce que vous considérez comme un «pic» en premier lieu. Peut-être n'importe quelle bosse qui dépasse un certain seuil (quelque chose comme 0,05 dans les parcelles que j'ai faites ci-dessus). Le principe de base est que vous devez trouver un moyen de séparer les pics "réels" ou "notables" du bruit.

Ensuite, pour chaque pic, vous pouvez mesurer sa largeur de deux manières. Comme je l'ai mentionné dans les commentaires ci-dessous, je pense qu'il est raisonnable de regarder la "demi-largeur maximale" mais vous pouvez également regarder le temps total pendant lequel le pic se situe au-dessus de votre seuil. Idéalement, vous devez utiliser plusieurs mesures différentes de la largeur du pic et indiquer dans quelle mesure vos résultats ont été cohérents avec ces choix.

Quelle que soit la ou les mesures de votre choix, vous pouvez utiliser le bootstrap pour calculer un intervalle de confiance pour chaque pic de chaque trace.

f = @(xy) mylowess(xy,x,0.15);
N_boot = 1000;
yboot_1 = bootstrp(N_boot,f,[x,Y1])';
yboot_2 = bootstrp(N_boot,f,[x,Y2])';

Ce code crée 1000 ajustements bootstrap pour les traces bleues et rouges dans les tracés ci-dessus. Un détail que je vais passer en revue est le choix du facteur de lissage 0,15 - vous pouvez choisir ce paramètre de telle sorte qu'il minimise l'erreur de validation croisée (voir le lien que j'ai publié). Il ne vous reste plus qu'à écrire une fonction qui isole les pics et estime leur largeur:

function [t_peaks,heights,widths] = getPeaks(t,Y)
%% Computes a list of times, heights, and widths, for each peak in a time series Y
%% (column vector) with associated time points t (column vector).

% The implementation of this function will be problem-specific...

Ensuite, vous exécutez ce code sur les 1000 courbes de chaque jeu de données et calculez les 2,5e et 97,5e centiles pour la largeur de chaque pic. Je vais illustrer cela sur la série temporelle Y1 - vous feriez de même pour la série temporelle Y2 ou tout autre ensemble de données d'intérêt.

N_peaks = 2;  % two peaks in example data
t_peaks = nan(N_boot,N_peaks);
heights = nan(N_boot,N_peaks);
widths = nan(N_boot,N_peaks);
for aa = 1:N_boot
  [t_peaks(aa,:),heights(aa,:),widths(aa,:)] = getPeaks(x,yboot_1(:,aa));
end

quantile(widths(:,1),[0.025 0.975]) % confidence interval for the width of first peak
quantile(widths(:,2),[0.025 0.975]) % same for second peak width

Si vous le souhaitez, vous pouvez effectuer des tests d'hypothèse plutôt que de calculer des intervalles de confiance. Notez que le code ci-dessus est simpliste - il suppose que chaque courbe inférieure amorcée aura 2 pics. Cette hypothèse n'est pas toujours valable, alors soyez prudent. J'essaie simplement d'illustrer l'approche que j'adopterais.

Remarque: la fonction "mylowess" est donnée dans le lien que j'ai posté ci-dessus. Voilà à quoi ça ressemble ...

function ys=mylowess(xy,xs,span)
%MYLOWESS Lowess smoothing, preserving x values
%   YS=MYLOWESS(XY,XS) returns the smoothed version of the x/y data in the
%   two-column matrix XY, but evaluates the smooth at XS and returns the
%   smoothed values in YS.  Any values outside the range of XY are taken to
%   be equal to the closest values.

if nargin<3 || isempty(span)
  span = .3;
end

% Sort and get smoothed version of xy data
xy = sortrows(xy);
x1 = xy(:,1);
y1 = xy(:,2);
ys1 = smooth(x1,y1,span,'loess');

% Remove repeats so we can interpolate
t = diff(x1)==0;
x1(t)=[]; ys1(t) = [];

% Interpolate to evaluate this at the xs values
ys = interp1(x1,ys1,xs,'linear',NaN);

% Some of the original points may have x values outside the range of the
% resampled data.  Those are now NaN because we could not interpolate them.
% Replace NaN by the closest smoothed value.  This amounts to extending the
% smooth curve using a horizontal line.
if any(isnan(ys))
  ys(xs<x1(1)) = ys1(1);
  ys(xs>x1(end)) = ys1(end);
end
Alex Williams
la source
Bienvenue sur notre site et merci d'avoir posté une réponse claire et bien illustrée. Cela ressemble à une bonne approche et à une technique prometteuse. Cela ne semble cependant pas répondre à la question: comment allez-vous procéder (a) pour identifier les "pics" et (b) pour tester formellement leur largeur?
whuber
Mon inclination serait de montrer les graphiques ci-dessus et de fournir une interprétation: "Les populations rouges et bleues présentent chacune deux pics autour de t = 25 et t = 65. La population rouge, cependant, approche ces pics à un rythme plus lent (par exemple pour le premier pic, commençant autour de t = 10 vs t = 15 pour la population bleue) ... "Les bandes de confiance à 95% donnent au lecteur une idée de ce que les courbes dans les courbes sont le bruit vs les effets réels. Je pense que cela devrait être suffisant pour expliquer l'ensemble de données original décrit pour la publication (si tel est l'objectif final).
Alex Williams
De nombreux examinateurs soulignent que (a) ces IC ne sont pas des IC pour les largeurs de pic et (b) même s'ils l'étaient, la comparaison directe des IC n'est pas une procédure statistique légitime avec des taux d'erreur connus de type I et de type II. D'où la question initiale: comment tester formellement les différences visuellement apparentes?
whuber
Si vous vouliez vraiment faire des calculs "formels" ... Je suppose que vous pourriez trouver tous les min / max locaux dans l'ajustement le plus bas (points où la première dérivée est zéro), puis calculer l'amplitude pour chaque pic (vous devrez peut-être ignorer les pics de petite amplitude), et enfin calculer la "demi-largeur maximale" de chaque pic (le temps entre le moment où la courbe est à mi-chemin et le moment où la courbe est à mi-chemin vers le bas). Ensuite, vous pouvez faire une procédure d'amorçage similaire à celle décrite dans ma réponse ci-dessus pour voir si la "demi-largeur maximale" rouge est toujours plus grande. Je peux fournir plus de détails s'il y a un intérêt.
Alex Williams
Le bootstrap est attrayant, mais il n'est pas du tout clair comment il doit être mené, étant donné qu'aucun modèle statistique spécifique n'a été proposé dans la question. Un type de modèle approprié pour les données est essentiel car (au minimum) ces séries chronologiques présenteront probablement une forte corrélation sérielle. D'autres détails sont presque aussi importants: comment déterminer quels pics sont "petits" et lesquels ne le sont pas? La largeur des pics doit-elle être mesurée à mi-hauteur ou à un autre endroit? Quel degré de lissage faut-il utiliser pour l'ajustement le plus bas? (Il y a au moins un paramètre arbitraire à définir.)
whuber