Ответ 1
В итоге я нашел точную функцию, которую я искал: interp.surface
из пакета fields
. Из текста справки:
Использует билинейные веса для интерполяции значений в прямоугольной сетке в произвольные местоположения или в другую сетку.
Я экспериментирую с тем, как справляться с overplotting в R, и одна вещь, которую я хочу попробовать, - наметить отдельные точки, но покрасить их по плотности их окрестности. Для этого мне нужно было бы вычислить двумерную оценку плотности ядра в каждой точке. Однако, по-видимому, стандартные функции оценки плотности ядра основаны на сетке. Есть ли функция для вычисления оценок плотности ядра 2D в определенных точках, которые я указываю? Я бы представил функцию, которая принимает векторы x и y в качестве аргументов и возвращает вектор оценок плотности.
В итоге я нашел точную функцию, которую я искал: interp.surface
из пакета fields
. Из текста справки:
Использует билинейные веса для интерполяции значений в прямоугольной сетке в произвольные местоположения или в другую сетку.
Если я понимаю, что вы хотите сделать, это может быть достигнуто путем подгонки модели сглаживания к оценке плотности сетки, а затем с ее использованием для прогнозирования плотности в каждой интересующей вас точке. Например:
# Simulate some data and put in data frame DF
n <- 100
x <- rnorm(n)
y <- 3 + 2* x * rexp(n) + rnorm(n)
# add some outliers
y[sample(1:n,20)] <- rnorm(20,20,20)
DF <- data.frame(x,y)
# Calculate 2d density over a grid
library(MASS)
dens <- kde2d(x,y)
# create a new data frame of that 2d density grid
# (needs checking that I haven't stuffed up the order here of z?)
gr <- data.frame(with(dens, expand.grid(x,y)), as.vector(dens$z))
names(gr) <- c("xgr", "ygr", "zgr")
# Fit a model
mod <- loess(zgr~xgr*ygr, data=gr)
# Apply the model to the original data to estimate density at that point
DF$pointdens <- predict(mod, newdata=data.frame(xgr=x, ygr=y))
# Draw plot
library(ggplot2)
ggplot(DF, aes(x=x,y=y, color=pointdens)) + geom_point()
Или, если я просто изменил n 10 ^ 6, получим