estimativa da densidade do kernel do pacote np com o kernel Epanechnikov

8

Estou trabalhando com o conjunto de dados "geyser" do pacote MASS e comparando as estimativas de densidade de kernel do pacote np.

Meu problema é entender a estimativa de densidade usando a validação cruzada de mínimos quadrados e o kernel Epanechnikov:

blep<-npudensbw(~geyser$waiting,bwmethod="cv.ls",ckertype="epanechnikov")
plot(npudens(bws=blep))

insira a descrição da imagem aqui

Para o kernel gaussiano, parece estar bem:

blga<-npudensbw(~geyser$waiting,bwmethod="cv.ls",ckertype="gaussian")
plot(npudens(bws=blga))

insira a descrição da imagem aqui

Ou se eu usar o kernel Epanechnikov e a probabilidade máxima de cv:

bmax<-npudensbw(~geyser$waiting,bwmethod="cv.ml",ckertype="epanechnikov")
plot(npudens(~geyser$waiting,bws=bmax))

É minha culpa ou é um problema no pacote?

Edit: Se eu usar o Mathematica para o kernel Epanechnikov e menos quadrados cv, ele está funcionando:

d = SmoothKernelDistribution[data, bw = "LeastSquaresCrossValidation", ker = "Epanechnikov"]
Plot[{PDF[d, x], {x, 20,110}]
TMoek
fonte

Respostas:

6

EDITAR

Isso é explicado nas perguntas frequentes :

Uso plot () (npplot ()) para plotar, digamos, uma densidade e o plot resultante se parece com uma densidade invertida em vez de uma densidade

Isso pode ocorrer quando a largura de banda orientada a dados é drasticamente reduzida. Os procedimentos de seleção de largura de banda orientada a dados (ou seja, automáticos) nem sempre garantem bons resultados devido à presença talvez de outliers ou ao arredondamento / discretização de dados contínuos, entre outros. Por padrão, npplot () pega os dois extremos dos dados (mínimo, máximo, ou seja, pontos de dados reais), em seguida, cria uma grade igualmente espaçada de dados de avaliação (ou seja, não são pontos de dados reais em geral) e calcula a densidade desses pontos. Como a largura de banda é extremamente pequena, a estimativa de densidade nesses pontos de avaliação é corretamente zero, enquanto as realizadas para as realizações da amostra (neste caso, apenas dois, o mínimo e o máximo) são diferentes de zero, portanto, obtemos dois picos nas bordas de o enredo e uma tigela plana igual a zero em qualquer outro lugar. Isso também pode acontecer quando seus dados são fortemente discretizados e você os trata como contínuos. Nesses casos, o tratamento dos dados conforme solicitado pode resultar em estimativas mais sensatas

Conforme sugerido, tratando os dados como ordenados, funciona:

blep<-npudensbw(~ordered(geyser$waiting), 
                bwmethod="cv.ls", ckertype="epanechnikov", ckerorder=2)

insira a descrição da imagem aqui

Também é bem-sucedido com ordens mais altas do kernel, como ckerorder=4neste exemplo:

insira a descrição da imagem aqui

direitos
fonte
Obrigado, mas por que ele funciona com o kernel gaussiano ou no Mathematica?
TMoek