реализация преобразованного KDE в R

Я следую инструкциям в конце этот пост для реализации преобразованной оценки плотности ядра (KDE) на ограниченной поддержке [0,+inf[. Мы используем прием преобразования, чтобы избежать смещения границ традиционного KDE на ограниченную поддержку (в этом случае около нуля). По сути, KDE присваивает веса наблюдениям, которые не существуют (вне поддержки), поэтому сильно занижает PDF на границе (как хорошо показано на рисунке ниже).

1) Обычный подход (мы наблюдаем нежелательное смещение границ KDE около нуля)

# sample from exponential distribution
obs=rexp(5e2)
hist(obs,freq=FALSE)
k=density(obs)
lines(k$x,k$y)

введите здесь описание изображения

2) Подход к трансформации

введите здесь описание изображения

# 1) log transform the obs
pseudo.obs=log(obs)
# 2) estimate the density of the pseudo obs with KDE
pseudo.k=density(pseudo.obs,n=length(obs))
# 3) estimate the density of the original obs
t.density=pseudo.k$y/obs
# plot estimation
lines(obs,t.density)

Вместо того, чтобы получить что-то похожее на синюю линию ниже, как я должен

введите здесь описание изображения

Я получаю эту ужасную вещь введите здесь описание изображения


person Antoine    schedule 30.09.2015    source источник
comment
Вы полагаете, что вам следует использовать что-то вроде pseudo.k$x, а не obs для построения t.density.   -  person    schedule 30.09.2015
comment
только что попробовал, все равно дает ужасные результаты...   -  person Antoine    schedule 30.09.2015
comment
Да, но правильно ли вычислено t.density?   -  person    schedule 30.09.2015
comment
ну, я оцениваю распределение псевдообследований с помощью KDE, а затем делю на исходные значения, что, похоже, соответствует приведенной выше формуле...   -  person Antoine    schedule 30.09.2015
comment
pseudo.k$x не будет работать, потому что он имеет дело с трансформированным пространством, тогда как нам нужен сюжет в исходном пространстве.   -  person Antoine    schedule 30.09.2015
comment
Я просто дал вам подсказку. obs тоже не правильный пробел, если я не ошибаюсь.   -  person    schedule 30.09.2015


Ответы (1)


Я мог бы использовать KDE по своей глупости без каких-либо преобразований, потому что он неограничен. Вот код, который работает:

# everything before is the same
# 2) estimate the density of the pseudo obs with KDE
pseudo.k=approxfun(density(pseudo.obs))
# 3) estimate the density of the original obs
seq=seq(min(obs),max(obs),length.out=500)
t.density=as.numeric(vector(length=length(seq)))
for (i in 1:length(seq)){
x=seq[i]
t.density[i]=pseudo.k(log(x))/x
}
# plot result
lines(seq,t.density,col="red")

введите здесь описание изображения

person Antoine    schedule 30.09.2015