plot(density(rexp(100))
Obviamente, toda a densidade à esquerda de zero representa viés.
Estou procurando resumir alguns dados para não estatísticos e quero evitar perguntas sobre por que os dados não negativos têm densidade à esquerda de zero. Os gráficos são para verificação aleatória; Quero mostrar as distribuições de variáveis por grupos de tratamento e controle. As distribuições geralmente são exponenciais. Os histogramas são complicados por várias razões.
Uma pesquisa rápida no google me fornece trabalho de estatísticos em núcleos não negativos, por exemplo: isto .
Mas alguma coisa foi implementada no R? Dos métodos implementados, algum deles é "melhor" de alguma forma para estatística descritiva?
EDIT: mesmo que o from
comando possa resolver meu problema atual, seria bom saber se alguém implementou kernels com base na literatura sobre estimativa de densidade não negativa
fonte
plot(density(rexp(100), from=0))
?Respostas:
Uma solução, emprestada de abordagens para ponderar a borda de estatísticas espaciais, é truncar a densidade à esquerda em zero, mas aumentar a ponderação dos dados mais próximos de zero. A idéia é que cada valor seja "espalhado" em um núcleo da área total da unidade centralizada em x ; qualquer parte do núcleo que se espalhe para território negativo é removida e o núcleo é normalizado para a área da unidade.x x
Por exemplo, com um kernel gaussiano , o peso da renormalização éKh( y, x ) = exp( - 12( ( y- x ) / h )2) / 2 π--√
onde é a função de distribuição cumulativa de uma variável normal de média xΦ x desvio padrão . Fórmulas comparáveis estão disponíveis para outros kernels.h
Isso é mais simples - e muito mais rápido na computação - do que tentar restringir as larguras de banda perto de . É difícil prescrever exatamente como as larguras de banda devem ser alteradas perto de 0 , de qualquer maneira. No entanto, este método também é0 0 0 0
Código R
A
density
função inR
irá reclamar que a soma dos pesos não é unidade, porque deseja que a integral sobre todos os números reais seja unidade, enquanto essa abordagem torna a integral sobre números positivos igual à unidade. Como verificação, a última integral é estimada como uma soma de Riemann.fonte
Uma alternativa é a abordagem de Kooperberg e colegas, com base na estimativa da densidade usando splines para aproximar a densidade de log dos dados. Vou mostrar um exemplo usando os dados da resposta do @ whuber, que permitirá uma comparação de abordagens.
Você precisará do pacote de logspline instalado para isso; instale-o se não estiver:
Carregue o pacote e estime a densidade usando a
logspline()
função:A seguir, presumo que o objeto
d
da resposta do @ whuber esteja presente no espaço de trabalho.O gráfico resultante é mostrado abaixo, com a densidade da linha de logs mostrada pela linha vermelha
Além disso, o suporte para a densidade pode ser especificado através de argumentos
lbound
eubound
. Se quisermos supor que a densidade é 0 à esquerda de 0 e há uma descontinuidade em 0, poderíamos usarlbound = 0
a chamada paralogspline()
, por exemploRendimento da seguinte estimativa de densidade (mostrada aqui com o
m
ajuste original da linha de logs, pois a figura anterior já estava ficando ocupada).O gráfico resultante é mostrado abaixo
x
x
fonte
logspline
? Para mim, a densidade de ambos, a versão limitada e a ilimitada chega a zero emx = 0
.Para comparar distribuições por grupos (que você diz ser o objetivo em um de seus comentários), por que não algo mais simples? Os gráficos de caixas paralelas funcionam bem se N for grande; os gráficos de faixas paralelas funcionam se N for pequeno (e ambos mostrarem valores discrepantes bem, o que você diz ser um problema em seus dados).
fonte
Como Stéphane comenta, você pode usar
from = 0
e, além disso, pode representar seus valores sob a curva de densidade comrug (x)
fonte
from=0
parece que apenas suprime a plotagem para valores abaixo de 0; não corrige o cálculo pelo fato de que parte da distribuição foi manchada abaixo de 0.from
comando gera um gráfico que parece ter o pico exatamente à direita de zero. Mas se você observar histogramas com compartimentos continuamente menores, muitos dados mostrarão o pico em zero. Ofrom
é apenas um truque gráfico.from=0
suprime nada. Apenas inicia a "grade" em zero.density(rexp(100), from=0)
não tem nada a ver com o gráfico