Estou tentando plotar um QQ-plot com dois conjuntos de dados de cerca de 1,2 milhão de pontos, em R (usando qqplot e alimentando os dados no ggplot2). O cálculo é fácil, mas o gráfico resultante é muito lento para carregar, porque há muitos pontos. Eu tentei a aproximação linear para reduzir o número de pontos para 10000 (isso é o que a função qqplot faz de qualquer maneira, se um dos seus conjuntos de dados é maior que o outro), mas você perde muitos detalhes nos detalhes.
A maioria dos pontos de dados em direção ao centro é basicamente inútil - eles se sobrepõem tanto que provavelmente há cerca de 100 por pixel. Existe alguma maneira simples de remover dados muito próximos, sem perder os dados mais esparsos em direção às caudas?
r
data-visualization
qq-plot
naught101
fonte
fonte
approx()
função entra em jogo naqqplot()
função.Respostas:
Os gráficos de QQ são incrivelmente autocorrelacionados, exceto nas caudas. Ao analisá-los, concentra-se na forma geral da trama e no comportamento da cauda. Portanto , você se sairá bem subamostrando grosseiramente nos centros das distribuições e incluindo uma quantidade suficiente de caudas.
Aqui está o código que ilustra como fazer a amostra em um conjunto de dados inteiro e como obter valores extremos.
Para ilustrar, esse conjunto de dados simulado mostra uma diferença estrutural entre dois conjuntos de dados de aproximadamente 1,2 milhão de valores, bem como uma quantidade muito pequena de "contaminação" em um deles. Além disso, para tornar esse teste rigoroso, um intervalo de valores é excluído de um dos conjuntos de dados completamente: o gráfico QQ precisa mostrar uma quebra para esses valores.
Podemos subamostrar 0,1% de cada conjunto de dados e incluir outros 0,1% de seus extremos, fornecendo 2420 pontos para plotagem. O tempo total decorrido é inferior a 0,5 segundos:
Nenhuma informação é perdida:
fonte
sin
? Estou certo de que um CDF normal seria uma função melhor se você assumisse que o x era normalmente distribuído? Você acabou de escolher o pecado porque é mais fácil de calcular?Em outras partes deste tópico, propus uma solução simples, mas um tanto ad hoc , de subamostragem dos pontos. É rápido, mas requer algumas experiências para produzir grandes parcelas. A solução a ser descrita é uma ordem de magnitude mais lenta (levando até 10 segundos para 1,2 milhão de pontos), mas é adaptável e automática. Para conjuntos de dados grandes, deve fornecer bons resultados na primeira vez e fazê-lo razoavelmente rapidamente.
Há alguns detalhes a serem resolvidos, especialmente para lidar com conjuntos de dados de diferentes comprimentos. Eu faço isso substituindo o menor pelos quantis correspondentes ao maior: com efeito, uma aproximação linear por partes do EDF do menor é usada em vez de seus valores reais de dados. ("Mais curto" e "mais longo" podem ser revertidos pela configuração
use.shortest=TRUE
.)Aqui está uma
R
implementação.Como exemplo, eu uso dados simulados, como na minha resposta anterior (com um outlier extremamente alto jogado
y
e um pouco mais de contaminaçãox
nesse período):Vamos plotar várias versões, usando valores cada vez menores do limite. Com um valor de .0005 e exibindo em um monitor com 1000 pixels de altura, estaríamos garantindo um erro não superior a metade de um pixel vertical em todo o gráfico. Isso é mostrado em cinza (apenas 522 pontos, unidos por segmentos de linha); as aproximações mais grosseiras são plotadas sobre ela: primeiro em preto, depois em vermelho (os pontos vermelhos serão um subconjunto dos pretos e os plotam em excesso), depois em azul (que novamente é um subconjunto e overplot). Os intervalos variam de 6,5 (azul) a 10 segundos (cinza). Dado que eles têm uma escala tão boa, pode-se usar da mesma maneira meio pixel como padrão universal para o limite ( por exemplo , 1/2000 para um monitor com 1000 pixels de altura) e terminar com ele.
Editar
Modifiquei o código original para
qq
retornar uma terceira coluna de índices na mais longa (ou mais curta, conforme especificado) das duas matrizes originaisx
ey
, correspondendo aos pontos selecionados. Esses índices apontam para valores "interessantes" dos dados e, portanto, podem ser úteis para análises adicionais.Também removi um erro que ocorria com valores repetidos de
x
(quebeta
eram indefinidos).fonte
qq
os argumentos de um determinado vetor? Além disso, você poderia aconselhar sobre como usar suaqq
função com oggplot2
pacote? Eu estava pensando em usarggplot2
'sstat_function
para isso.A remoção de alguns dos pontos de dados no meio alteraria a distribuição empírica e, portanto, o qqplot. Dito isto, você pode fazer o seguinte e plotar diretamente os quantis da distribuição empírica versus os quantis da distribuição teórica:
Você terá que ajustar o seq, dependendo da profundidade que deseja entrar na cauda. Se você quiser ser esperto, também pode afinar essa sequência no meio para acelerar o enredo. Por exemplo, usando
é uma possibilidade.
fonte
Você poderia fazer um
hexbin
enredo.fonte
Outra alternativa é um boxplot paralelo; você disse que tinha dois conjuntos de dados, algo como:
e você pode ajustar as várias opções para melhorar seus dados.
fonte