Альтернативой sm.density
является оценка плотности на более тонкой сетке, чем по умолчанию, и используйте approx
или approxfun
для получения интерполированных значений плотности на желаемом Returns
. Вот пример с фиктивными данными:
set.seed(1)
foo <- data.frame(Date = seq(as.Date("2010-01-01"), as.Date("2010-12-31"),
by = "days"),
Returns = rnorm(365))
head(foo)
## compute the density, on fin grid (512*8 points)
dens <- with(foo, density(Returns, n = 512 * 8))
На этом этапе мы могли бы использовать approx()
для интерполяции x
и y
компонентов возвращаемой плотности, но я предпочитаю approxfun()
, который делает то же самое, но возвращает функцию, которую мы затем можем использовать сделать интерполяцию. Сначала сгенерируйте функцию интерполяции:
## x and y are components of dens, see str(dens)
BAR <- with(dens, approxfun(x = x, y = y))
Теперь вы можете использовать BAR()
, чтобы вернуть интерполированную плотность в любой точке, которую вы хотите, например, за первый Returns
:
> with(foo, BAR(Returns[1]))
[1] 0.3268715
Чтобы завершить пример, добавьте плотность для каждого элемента в Returns
:
> foo <- within(foo, Density <- BAR(Returns))
> head(foo)
Date Returns Density
1 2010-01-01 -0.6264538 0.3268715
2 2010-01-02 0.1836433 0.3707068
3 2010-01-03 -0.8356286 0.2437966
4 2010-01-04 1.5952808 0.1228251
5 2010-01-05 0.3295078 0.3585224
6 2010-01-06 -0.8204684 0.2490127
Чтобы увидеть, насколько хорошо работает интерполяция, мы можем построить плотность и интерполированную версию и сравнить. Обратите внимание, что мы должны отсортировать Returns
, потому что для достижения желаемого эффекта, lines
необходимо просматривать данные в порядке по возрастанию:
plot(dens)
with(foo, lines(sort(Returns), BAR(sort(Returns)), col = "red"))
Что дает что-то вроде этого:
Пока плотность оценивается при достаточно точном наборе точек (512 * 8 в приведенном выше примере), у вас не должно быть никаких проблем, и вам будет трудно сказать разницу между интерполированной версией и реальной вещью , Если у вас есть «пробелы» в значениях вашего Returns
, то вы можете обнаружить, что, поскольку lines()
просто соединяет точки, которые вы просите построить, сегменты прямых линий могут не следовать плотности черного в местах расположения пробелов , Это просто артефакт пробелов и того, как работает lines()
, а не проблема с интерполяцией.