Intervalos de confiança em torno de um centróide com similaridade de Gower modificada

9

Eu gostaria de obter intervalos de confiança de 95% para os centróides com base na semelhança de Gower entre algumas amostras multivariadas (dados da comunidade de núcleos de sedimentos). Até agora, usei o vegan{}pacote em R para obter a similaridade de Gower modificada entre os núcleos (baseado em Anderson 2006; agora incluído no R como parte de vegdist()). Alguém sabe como posso calcular intervalos de confiança de 95% para os centróides de, por exemplo, locais de amostragem, com base na similaridade modificada de Gower?

Além disso, se possível, eu gostaria de plotar esses ICs de 95% em um PCO que mostre os centróides, por isso é evidente se eles estão sobrepostos.

Para obter a similaridade de Gower modificada, usei:

dat.mgower <- vegdist(decostand(dat, "log"), "altGower")

Mas, tanto quanto eu sei, você não recebe centróides vegdist(). Preciso obter centróides, depois ICs 95%, depois plotá-los ... em R. Help!

Anderson, MJ, KE Ellingsen e BH McArdle. 2006. Dispersão multivariada como uma medida da diversidade beta. Cartas de ecologia 9: 683–693.

Margaret
fonte
Se você está olhando para clusters em dimensões k, os centróides não são k-dimensionais? Nesse caso, você deve procurar regiões de confiança e não intervalos. Qualquer região de confiança para uma variável como um centro de cluster dependeria de todos os componentes que compõem a incerteza na estimativa. Eu acho que isso pode ser bastante complexo e que gerar regiões de confiança não seria uma questão simples. Você não poderia fazer uma simulação para aproximá-los?
Michael R. Chernick
Obrigado Michael. Sim, eu quis dizer regiões de confiança, que estariam no espaço k-dimensional onde k é o número de táxons encontrados na comunidade. Eu faria simulações em vez de calculá-las, mas não sei como fazer isso. CIs aproximados serviriam.
219 Margaret Margaret
1
Vejo que houve alguma discussão enquanto escrevia minha resposta. Não sei ao certo o que você descreve e ilustro é em termos das espécies, pois jogamos essas informações fora no cálculo das diferenças. Podemos então calcular os centróides em algum espaço de ordenação, neste caso, um PCO das dissimilaridades de Gower modificadas. Deixe-me saber se não é isso que você queria e posso tentar ajudar um pouco mais. k
Gavin Simpson
1
Outra abordagem seria inicializar. Para os pontos n dimensionais, gere amostras de autoinicialização amostrando n vezes com a substituição do conjunto de dados. Execute o conjunto de dados de autoinicialização através do algoritmo de cluster. Repita isso várias vezes. Isso fornecerá uma distribuição dos clusters e centróides escolhidos. Em seguida, para cada centróide (se você puder corresponder de uma amostra de bootstrap para outra), você obteria uma distribuição de centróides para cada cluster e, desse modo, construiria regiões de confiança para eles.
Michael R. Chernick
1
@MichaelChernick Isso pode não ser um problema muito se os agrupamentos forem definidos a priori, conforme meu exemplo. Isso seria típico do tipo de dados descrito no artigo que Margaret cita.
Gavin Simpson

Respostas:

5

Não estou imediatamente esclarecido qual centróide você deseja, mas o centróide que vem à mente é o ponto no espaço multivariado no centro da massa dos pontos por grupo. Sobre isso, você deseja uma elipse de 95% de confiança. Ambos os aspectos podem ser calculados usando a ordiellipse()função no vegan . Aqui está um exemplo modificado de ?ordiellipsemas usando um PCO como um meio para incorporar as diferenças em um espaço euclidiano do qual podemos derivar centróides e elipses de confiança para grupos com base na variável Gerenciamento da Natureza Management.

require(vegan)
data(dune)
dij <- vegdist(decostand(dune, "log"), method = "altGower")
ord <- capscale(dij ~ 1) ## This does PCO

data(dune.env) ## load the environmental data

Agora, exibimos os 2 primeiros eixos PCO e adicionamos uma elipse de 95% de confiança com base nos erros padrão da média das pontuações do eixo. Queremos erros padrão para definir kind="se"e usar o confargumento para fornecer o intervalo de confiança necessário.

plot(ord, display = "sites", type = "n")
stats <- with(dune.env,
              ordiellipse(ord, Management, kind="se", conf=0.95, 
                          lwd=2, draw = "polygon", col="skyblue",
                          border = "blue"))
points(ord)
ordipointlabel(ord, add = TRUE)

Observe que eu capturei a saída de ordiellipse(). Isso retorna uma lista, um componente por grupo, com detalhes do centróide e da elipse. Você pode extrair o centercomponente de cada um deles para chegar aos centróides

> t(sapply(stats, `[[`, "center"))
         MDS1       MDS2
BF -1.2222687  0.1569338
HF -0.6222935 -0.1839497
NM  0.8848758  1.2061265
SF  0.2448365 -1.1313020

Observe que o centróide é apenas para a solução 2D. Uma opção mais geral é calcular você mesmo os centróides. O centróide é apenas a média individual das variáveis ​​ou, neste caso, os eixos PCO. Como você está trabalhando com as diferenças, elas precisam ser incorporadas em um espaço de ordenação para que você tenha eixos (variáveis) dos quais você pode calcular as médias. Aqui, as pontuações do eixo estão em colunas e os sites em linhas. O centróide de um grupo é o vetor de médias da coluna para o grupo. Existem várias maneiras de dividir os dados, mas aqui eu uso aggregate()para dividir as pontuações nos 2 primeiros eixos PCO em grupos com base Managemente calcular suas médias

scrs <- scores(ord, display = "sites")
cent <- aggregate(scrs ~ Management, data = dune.env, FUN = mean)
names(cent)[-1] <- colnames(scrs)

Isto dá:

> cent
  Management       MDS1       MDS2
1         BF -1.2222687  0.1569338
2         HF -0.6222935 -0.1839497
3         NM  0.8848758  1.2061265
4         SF  0.2448365 -1.1313020

que é igual aos valores armazenados statscomo extraídos acima. A aggregate()abordagem generaliza para qualquer número de eixos, por exemplo:

> scrs2 <- scores(ord, choices = 1:4, display = "sites")
> cent2 <- aggregate(scrs2 ~ Management, data = dune.env, FUN = mean)
> names(cent2)[-1] <- colnames(scrs2)
> cent2
  Management       MDS1       MDS2       MDS3       MDS4
1         BF -1.2222687  0.1569338 -0.5300011 -0.1063031
2         HF -0.6222935 -0.1839497  0.3252891  1.1354676
3         NM  0.8848758  1.2061265 -0.1986570 -0.4012043
4         SF  0.2448365 -1.1313020  0.1925833 -0.4918671

Obviamente, os centróides nos dois primeiros eixos PCO não mudam quando solicitamos mais eixos; portanto, você pode computar os centróides em todos os eixos uma vez e depois usar a dimensão que desejar.

Você pode adicionar os centróides ao gráfico acima com

points(cent[, -1], pch = 22, col = "darkred", bg = "darkred", cex = 1.1)

O gráfico resultante será agora parecido com este

uso de ordiellipse

Finalmente, o vegan contém as funções adonis()e betadisper()que são projetadas para observar diferenças nas médias e variações de dados multivariados de maneira muito semelhante aos documentos / software de Marti. betadisper()está intimamente ligado ao conteúdo do artigo que você cita e também pode devolver os centróides para você.

Gavin Simpson
fonte
1
Leia a ajuda ?ordiellipsepara obter detalhes do que está sendo feito aqui, especialmente no cálculo do intervalo de confiança. Se a teoria corresponde aos dados é algo que você pode querer examinar com simulação ou reamostragem ou algo ao invés de confiar na "teoria".
Gavin Simpson
1
Após o comentário e o último parágrafo da resposta; adonis()pode ser usado para testar médias semelhantes (centróides) de grupos, como se pode usar ANOVA no caso univariado. Um teste de permutação é usado para determinar se os dados são consistentes com a hipótese nula de que não há diferença de centróides. Observe também que as diferenças de centróides podem ser causadas por diferentes dispersões de grupos (variações). betadisper()pode ajudá-lo a testar se for esse o caso, novamente usando um teste baseado em permutação das distâncias médias dos pontos da amostra até o centróide.
Gavin Simpson
@ Gavin-- obrigado. Fiz o teste para medir as diferenças entre os centróides usando o PERMANOVA e o PERMDISP no PRIMER (que executam a mesma tarefa que adonis()e betadisp(), acredito), estava apenas procurando uma boa maneira de exibir os dados. Eu tenho alguma interação site x estação para um design de medidas repetidas, então eu queria poder mostrar facilmente quais sites mostraram um efeito sazonal. Eu acho que essas elipses são o que estou procurando; Este exemplo foi muito útil.
1759 Margaret Margaret
Além disso, sim - o centro de massa multivariado para cada grupo é o tipo de centróide para o qual eu estava tentando calcular ICs.
1759 Margaret Margaret
Mais uma coisa: se eu quisesse preencher as elipses com cores diferentes, dependendo dos meus fatores, existe uma maneira de fazer isso ordiellipse()sem incorporar um loop for? Eu tenho estações e sites em meus dados e queria mostrar sites de diferenças em um gráfico e estações em outro codificando-os por cores. Por qualquer motivo, usar col = c (1,2,1,2) etc não funciona, nem col = as.numeric (cent ["Site_TP"]). Existe uma maneira elegante de fazer isso?
Margaret Margaret