Проблема проста.У меня есть ковариата x
и некоторый результат y
, и я хотел бы найти оценку Надарьи-Ватсона y
на основе x
.Однако я хотел бы найти функцию, которая удовлетворяет нескольким условиям:
- Помимо оценки, она возвращает также веса
- Она обрабатывает не только равномерно распределенные точки, для которых предоставляется оценка.
- Это достаточно быстро.
Я могу просто реализовать это самостоятельно.Моя наивная функция оценки выглядит примерно так:
mNW <- function(x, X, Y, h, K = dnorm) {
# Arguments
# x: evaluation points
# X: covariates
# Y: outcome
# h: bandwidth
# K: kernel
Kx <- sapply(X, function(Xi) K((x - Xi) / h))
# Weights
W <- Kx / rowSums(Kx)
# NW estimate
m <- W %*% Y
return(list(m = m, W = W))
}
set.seed(123)
X <- rnorm(1000)
Y <- 1 + X - 2*X^2 + rnorm(1000)
x <- c(-3, -2.1, -0.7, 0, 0.3, 0.8, 1, 1.9, 3.2)
mNW(x, X, Y, h = 0.5)
Работает нормально, но медленно.Поэтому я попытался найти что-то уже реализованное.Первый выбор был kernsmooth
:
ksmooth(X, Y, kernel = "normal", bandwidth = 0.5, x.points = x)
Этот вариант быстрее, но он не возвращает веса.Более того, он использует только ядра "box"
и "normal"
.
Я также пробовал locpoly
из KernSmooth
пакета:
locpoly(X, Y, drv = 0, kernel = "normal", bandwidth = 0.5,
gridsize = 9, range.x = c(-3, 3.2))
Кроме того, он не возвращает веса, я не смог запустить функцию для моей собственной спецификации x
и мне пришлось использовать одинаково расположенные значения в некотором указанном диапазоне.
Поэтому мне интересно, есть ли что-то, чего мне не хватало в этих функциях, или есть другое решение в R для оценки NW.