Testar a uniformidade é algo comum, no entanto, pergunto-me quais são os métodos para fazer isso em uma nuvem multidimensional de pontos.
Testar a uniformidade é algo comum, no entanto, pergunto-me quais são os métodos para fazer isso em uma nuvem multidimensional de pontos.
Respostas:
O método padrão usa a função K de Ripley ou algo derivado dela, como uma função L. Este é um gráfico que resume o número médio de vizinhos dos pontos em função da distância máxima afastada ( ). Para uma distribuição uniforme em n dimensões, essa média deve se comportar como ρ n : e sempre será para ρ pequeno . Ele se afasta desse comportamento devido ao agrupamento, outras formas de não independência espacial e efeitos de borda (de onde é crucial especificar a região amostrada pelos pontos). Por causa dessa complicação - que piora à medida que naumenta - na maioria das aplicações, uma faixa de confiança é erguida para a função K nula por simulação e a função K observada é super-plotada para detectar excursões. Com algum pensamento e experiência, as excursões podem ser interpretadas em termos de tendências de agrupar ou não a determinadas distâncias.
Exemplos de uma função K e sua função L associada de Dixon (2001), ibid. A função L é construída de modo que para uma distribuição uniforme seja a linha horizontal em zero: uma boa referência visual. As linhas tracejadas são faixas de confiança para essa área de estudo específica, computadas por simulação. O traço cinza sólido é a função L dos dados. A excursão positiva nas distâncias de 0 a 20 m indica algum agrupamento nessas distâncias.
Postei um exemplo trabalhado em resposta a uma pergunta relacionada em /stats//a/7984 , em que um gráfico derivado da função K para uma distribuição uniforme em um coletor bidimensional incorporado em é estimado por simulação.
Em R
, o spatstat funções kest
e k3est
calcular a função K para e n = 3 , respectivamente. Em mais de três dimensões, você provavelmente está sozinho, mas os algoritmos seriam exatamente os mesmos. Você pode fazer os cálculos a partir de uma matriz de distância conforme calculado (com eficiência moderada) por .stats::dist
Acontece que a pergunta é mais difícil do que eu pensava. Ainda assim, fiz minha lição de casa e, depois de olhar em volta, encontrei dois métodos além das funções de Ripley para testar a uniformidade em várias dimensões.
Eu criei um pacote R chamado unf
que implementa os dois testes. Você pode baixá-lo no github em https://github.com/gui11aume/unf . Uma grande parte está em C, portanto você precisará compilá-lo em sua máquina R CMD INSTALL unf
. Os artigos nos quais a implementação se baseia estão em formato pdf no pacote.
O primeiro método vem de uma referência mencionada por @Procrastinator ( Testando a uniformidade multivariada e suas aplicações, Liang et al., 2000 ) e permite testar a uniformidade apenas no hipercubo da unidade. A idéia é projetar estatísticas de discrepância assintoticamente gaussianas pelo teorema do limite central. Isso permite calcular uma
library(unf)
set.seed(123)
# Put 20 points uniformally in the 5D hypercube.
x <- matrix(runif(100), ncol=20)
liang(x) # Outputs the p-value of the test.
[1] 0.9470392
A segunda abordagem é menos convencional e usa árvores abrangentes mínimas . O trabalho inicial foi realizado por Friedman & Rafsky em 1979 (referência na embalagem) para testar se duas amostras multivariadas são da mesma distribuição. A imagem abaixo ilustra o princípio.
Os pontos de duas amostras bivariadas são plotados em vermelho ou azul, dependendo da amostra original (painel esquerdo). A árvore de abrangência mínima da amostra agrupada em duas dimensões é calculada (painel do meio). Esta é a árvore com a soma mínima dos comprimentos das arestas. A árvore é decomposta em subárvores onde todos os pontos têm os mesmos rótulos (painel direito).
Na figura abaixo, mostro um caso em que pontos azuis são agregados, o que reduz o número de árvores no final do processo, como você pode ver no painel direito. Friedman e Rafsky calcularam a distribuição assintótica do número de árvores que se obtém no processo, o que permite realizar um teste.
Essa idéia de criar um teste geral de uniformidade de uma amostra multivariada foi desenvolvida por Smith e Jain em 1984 e implementada por Ben Pfaff em C (referência no pacote). A segunda amostra é gerada uniformemente no casco convexo aproximado da primeira amostra e o teste de Friedman e Rafsky é realizado no conjunto de duas amostras.
A vantagem do método é que ele testa uniformidade em todas as formas multivariadas convexas e não apenas no hipercubo. A grande desvantagem é que o teste tem um componente aleatório porque a segunda amostra é gerada aleatoriamente. Obviamente, é possível repetir o teste e calcular a média dos resultados para obter uma resposta reproduzível, mas isso não é útil.
Continuando a sessão R anterior, aqui está como ele vai.
pfaff(x) # Outputs the p-value of the test.
pfaff(x) # Most likely another p-value.
Sinta-se livre para copiar / bifurcar o código no github.
O par seria uniforme dependente de onde U ∼ U n i