Como testar se a variação de duas distribuições é diferente se as distribuições não são normais


8

Estou estudando duas populações geograficamente isoladas da mesma espécie. Inspecionando as distribuições, vejo que ambas são bimodais (há certa sazonalidade em sua ocorrência), mas os picos em uma população são muito mais altos e mais estreitos (ou seja, a variação dos picos locais é menor).

Que tipo de teste estatístico seria apropriado para determinar se essas diferenças são significativas?

Para esclarecer, meu eixo y é o número de indivíduos identificados em uma armadilha em um dia específico, e o eixo x é o dia juliano.


Você pode tentar fazer alguma detecção externa. en.wikipedia.org/wiki/Outlier .

Você é capaz de escrever um modelo estatístico? Além disso, existem muitas maneiras diferentes de especificar "as variações não são iguais" e "as variações são iguais" e sua conclusão pode depender de quais escolhas particulares você faz, especialmente se for uma diferença sutil. Portanto, é melhor usar um modelo escolhido por você, em vez de um escolhido por alguém sem contexto.
probabilityislogic

1
São os dois! Você tem uma série temporal de contagens.
whuber

1
Ajudaria imensamente ter um modelo, ou pelo menos alguma teoria sugestiva, que tente explicar por que alguns picos seriam mais estreitos e outros mais amplos. Como você está interessado nas larguras desses picos, você deve ter pelo menos um modelo conceitual , se não quantitativo. Que mecanismos você acha que produzem tais picos e governam suas larguras? Você tem informações independentes que sugerem quando os picos devem ocorrer? (Isso reduz a incerteza na identificação de picos.) Os picos ocorrem de forma contemporânea ou em momentos diferentes?
whuber

2
@whuber, os picos das duas populações são quase contemporâneos. Um está em latitudes temperadas e outro em latitudes tropicais. Nossa hipótese é que a população tropical tem um nicho ecológico mais restrito do que a população temperada (ou seja, um número maior de predadores e patógenos pressiona a população a um tempo de emergência estreito). Isso ajuda?
Atticus29

Respostas:


3

Essas distribuições são de alguma coisa ao longo do tempo? Conta, talvez? (Se sim, então você pode precisar de algo bem diferente das discussões aqui até agora)

O que você descreve não parece ser muito bem entendido como uma diferença na variação das distribuições.

Parece que você está descrevendo algo vagamente assim (ignore os números nos eixos, é apenas para dar uma idéia do tipo geral de padrão que você parece estar descrevendo):

picos bimodais

Se estiver certo, considere:

Embora a largura de cada pico sobre os centros locais seja mais estreita para a curva azul, a variação geral das distribuições de vermelho e azul dificilmente difere.

Se você identificar os modos e antimodos de antemão, poderá medir a variabilidade local.


Esta é exatamente a minha pergunta. Obrigado! Então, restringir minha faixa do eixo x para abranger, digamos, apenas o primeiro pico, e depois realizar ... um teste F ?? ... seria a melhor abordagem?
Atticus29

Você provavelmente não gostaria de fazer especificamente um teste F para variações, eu acho, por algumas razões (se você testar a variação dessa maneira, @fileunderwater mencionou algumas alternativas ao teste F). Mas antes de chegarmos tão longe, você poderia abordar as duas perguntas na parte superior do meu post? Essa distribuição de contagens é feita ao longo do tempo?
Glen_b -Reinstala Monica

eles são (veja as edições da pergunta).
Atticus29

com as novas informações e de acordo com o meu comentário à resposta do fileunderwater acima, você tem alguma sugestão?
Atticus29

1
Parece haver considerável confusão na pergunta e nos comentários sobre o que é uma "variação". Nos exemplos de Glen_b, os dados azuis apresentam variações maiores que os dados vermelhos em torno dos dois picos aparentes (próximo de x = 10 ex = 17), porque os dados azuis oscilam mais entre valores baixos e altos (que são plotados no eixo vertical, não a horizontal, que aparentemente representa o tempo ).
whuber

3

Antes de tudo, acho que você deve examinar as distribuições sazonais separadamente, já que a distribuição bimodal provavelmente será o resultado de dois processos bastante separados. As duas distribuições podem ser controladas por mecanismos diferentes, de modo que, por exemplo, as distribuições de inverno sejam mais sensíveis ao clima anual. Se você quiser examinar as diferenças populacionais e as razões para isso, acho que é mais útil estudar as distribuições sazonais separadamente.

Quanto a um teste, você pode tentar o teste de Levine (basicamente um teste de homocedasticidade), usado para comparar variações entre os grupos. O teste de Bartlett é uma alternativa, mas o teste de Levene deve ser mais robusto à não normalidade (especialmente ao usar a mediana para o teste). Em R, os testes de Levene e Bartlett são encontrados em library(car).


Estou analisando o teste de Levene no R (encontrei-o na biblioteca "carro"). Parece que apenas leva um objeto de modelo linear como argumento. Isso realmente não faz sentido no meu caso, porque eu só quero comparar a variação de duas distribuições (não analisá-las com modelos lineares e validar essas suposições). Algum conselho?
Atticus29

1
@ Atticus29 Sim, está no carro - meu erro. No entanto, não é baseado em um modelo linear estrito - você pode usar leveneTest(y ~ as.factor(group), data= datafile)para um teste de diferença de variância entre grupos e, se você usar a opção `center =" mediana ", será mais robusta à não normalidade. Estritamente, acho que é chamado teste de Brown-Forsythe se for baseado na mediana.
fileunderwater

Ok, então, pergunta idiota, mas eu tenho duas colunas de dados que são contagens de indivíduos de uma espécie específica capturados em armadilhas. Essas duas colunas representam contagens da mesma espécie nos mesmos dias de locais diferentes. Eu não tenho certeza de como agrupá-los usando localização sem perder as informações de data usando o formato acima, se isso faz sentido ....
Atticus29

@ Atticus Você pode incluir alguns dados de amostra na sua pergunta (incluindo todas as colunas e variáveis ​​de classificação)? Isso ajudaria a esclarecer algumas das confusões sobre exatamente que tipo de dados você possui (veja, por exemplo, comentários de @whuber). Meu sentimento era que você reuniu todos os registros de espécies de duas estações, mas agora, quando reli seu Q, esse parece não ser o caso, e não tenho certeza de que minha solução seja adequada. Você só tem armadilhas em dois locais e tem contagens diárias (?) Nessas ao longo do tempo (por um único ano)?
fileunderwater

[cnd] ... O que você acha que o pico do final da temporada é causado por; uma segunda geração no mesmo ano (que taxa você estuda?) ou dois fenótipos diferentes? @ Atticus29
fileunderwater

2

Concordo com o que os outros disseram - ou seja, que "variação" é provavelmente a palavra errada a ser usada (visto que a função que você está considerando não é uma distribuição de probabilidade, mas uma série temporal).

Eu acho que você pode querer abordar esse problema de uma perspectiva diferente - basta ajustar as duas séries temporais com curvas LOWESS. Você pode calcular intervalos de confiança de 95% e comentar qualitativamente suas formas. Não sei se você precisa fazer algo mais sofisticado do que isso.

Eu escrevi alguns códigos do MATLAB abaixo para ilustrar o que estou dizendo. Estou com pressa, mas posso fornecer esclarecimentos em breve. Muito do que fiz pode ser retirado diretamente daqui: 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')

Você pode normalizar as duas séries temporais para comparar suas tendências relativas em vez de seus níveis absolutos.

%% 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')

Agora faça LOWESS se encaixa ...

%% 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')

insira a descrição da imagem aqui

Por fim, você pode criar faixas de confiança de 95% da seguinte maneira:

%% 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')

Agora você pode interpretar a figura final como desejar e possui os ajustes LOWESS para apoiar sua hipótese de que os picos na curva vermelha são realmente mais amplos que a curva azul. Se você tiver uma idéia melhor de qual é a função, poderá fazer uma regressão não linear.

Edit: Com base em alguns comentários úteis abaixo, estou adicionando mais alguns detalhes sobre a estimativa de largura de pico explicitamente. Primeiro, você precisa criar uma definição para o que você considera um "pico" em primeiro lugar. Talvez qualquer aumento que ultrapasse algum limite (algo como 0,05 nas parcelas que fiz acima). O princípio básico é que você deve encontrar uma maneira de separar picos "reais" ou "notáveis" do ruído.

Então, para cada pico, você pode medir sua largura de duas maneiras. Como mencionei nos comentários abaixo, acho razoável examinar a "meia largura máxima", mas você também pode observar o tempo total em que o pico está acima do seu limite. Idealmente, você deve usar várias medidas diferentes de largura de pico e relatar a consistência de seus resultados com essas opções.

Quaisquer que sejam suas métricas de escolha, você pode usar a inicialização para calcular um intervalo de confiança para cada pico em cada rastreamento.

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])';

Esse código cria 1000 ajustes autoinicializados para os traços azul e vermelho nos gráficos acima. Um detalhe que abordarei é a escolha do fator de suavização 0,15 - você pode escolher este parâmetro para minimizar o erro de validação cruzada (consulte o link que eu publiquei). Agora tudo o que você precisa fazer é escrever uma função que isola os picos e estima sua largura:

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...

Em seguida, você executa esse código nas 1000 curvas de cada conjunto de dados e calcula os percentis 2,5 e 97,5 para a largura de cada pico. Ilustrarei isso na série temporal Y1 - você faria o mesmo na série temporal Y2 ou em qualquer outro conjunto de dados de interesse.

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

Se desejar, você pode executar testes de hipóteses em vez de calcular intervalos de confiança. Observe que o código acima é simplista - ele assume que cada curva de bootess com bootstrap terá 2 picos. Essa suposição nem sempre é válida, portanto, tenha cuidado. Eu só estou tentando ilustrar a abordagem que eu adotaria.

Nota: a função "mylowess" é fornecida no link que eu postei acima. Isto é o que parece...

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

Bem-vindo ao nosso site e obrigado por postar uma resposta clara e com boas informações. Parece uma boa abordagem e uma técnica promissora. Parece não ter respondido à pergunta, no entanto: como você iria (a) identificar "picos" e (b) testar formalmente suas larguras?
whuber

Minha inclinação seria mostrar as parcelas acima e fornecer uma interpretação: "As populações vermelha e azul mostram dois picos em torno de t = 25 et = 65. A população vermelha, no entanto, se aproxima desses picos em uma taxa mais lenta (por exemplo, pela primeira vez). pico, começando em torno de t = 10 vs. t = 15 para a população azul) ... "As faixas de confiança de 95% dão ao leitor uma noção do que as curvas nas curvas são ruído versus efeitos reais. Eu acho que isso deve ser suficiente para explicar o conjunto de dados original descrito para publicação (se esse for o objetivo final).
Alex Williams

Muitos revisores apontam que (a) esses ICs não são ICs para as larguras de pico e (b) mesmo se fossem, a comparação direta de ICs não é um procedimento estatístico legítimo com taxas de erro conhecidas do Tipo I e do Tipo II. Daí a pergunta original: como testar formalmente as diferenças visualmente aparentes?
whuber

Se você realmente quisesse fazer alguns cálculos "formais" ... Suponho que você possa encontrar todos os valores mínimos / máximos locais no ajuste de menor valor (pontos em que a primeira derivada é zero), calcule a amplitude de cada pico (talvez seja necessário ignore picos de pequena amplitude) e, finalmente, calcule a "metade da largura máxima" de cada pico (o tempo entre o momento em que a curva está na metade do caminho e quando a curva está na metade do caminho). Em seguida, você pode executar um procedimento de inicialização semelhante ao descrito na minha resposta acima para verificar se a "metade da largura máxima" é consistentemente maior. Eu posso fornecer mais detalhes se houver interesse.
Alex Williams

O bootstrapping é atraente, mas ainda não está claro como deve ser conduzido, dado que nenhum modelo estatístico específico foi proposto na questão. Algum tipo de modelo apropriado para os dados é essencial porque (no mínimo) essas séries temporais provavelmente exibirão forte correlação serial. Outros detalhes são quase tão importantes: como determinar quais picos são "pequenos" e quais não são? As larguras dos picos devem ser medidos à meia altura ou em algum outro ponto? Qual o grau de suavização que deve ser usado para o ajuste da redução? (Há pelo menos um parâmetro arbitrário a ser definido.)
whuber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.