我想知道R中的KDE函数是如何实现的,因为我在我的图中看到了一些奇怪的东西。
dates5.csv只不过是:
day
2013-01-02
2013-03-01
即。两个约会。现在我读入数据,用if计算矩形KDE,得到下图:
data <- read.csv("dates5.csv", header=T)
days <- data$day
daysPosix <- as.POSIXct(days, tz="Europe/Zurich")
# compute density
ds <- density(as.numeric(daysPosix),
bw = 3600 * 24 * 7,
kernel = "rectangular",
cut = 3)
plot(ds, xaxt ="n", xlab="", ylab="", ylim = c(0,max(ds$y)),
main = "Temporal density (uniform kernel,
bandwidth = 7 days)")
points(x = as.numeric(daysPosix),
y=rep(0, length(daysPosix)),
pch="|",
col="#00000080")
times.seq <- seq(daysPosix[1],
daysPosix[length(daysPosix)],
by = "weeks")
labels = strftime(times.seq, "%d.%m.%y")
axis(1,times.seq,labels)
x轴上的刻度线由周分隔。乍一看,情节很有意义,在两点之上建立了两个矩形形状。 仍有两件事情我不明白: 为什么每个“形状”的大致范围都超过3周,而不是预期的7天(因为这是带宽?)?为什么形状两边都有<陡峭的“悬崖”而不是垂直的?
答案 0 :(得分:3)
?density
注意到:
bw
要使用的平滑带宽。 对内核进行缩放,使其成为平滑内核的标准偏差。
所以bw = 3600*24*7/sqrt(12)
似乎给出了一周宽的形状。换句话说,你需要“缩小”你的带宽,这样当它被density
缩放时,你得到了你想要的东西。您也可以设置adjust = 1/sqrt(12)
。
要使形状具有垂直下降,请增加n
以提高计算分辨率,例如n = 2^15
。
因此,请将density
电话改为:
ds <- density(as.numeric(daysPosix),
bw = 3600 * 24 * 7 / sqrt(12),
kernel = "rectangular",
cut = 3, n=2^15)
检查形状的宽度:
which(abs(diff(ds$y))>max(ds$y)/2) # approximate locations of the edges
[1] 1197 4469 28299 31571
(ds$x[4469]-ds$x[1197])/(3600*24*7)
[1] 1.00034