我不知道它是否有趣(鉴于最初的问题和它已经收到的答案)但是,我想建议一种替代方法。将来它也可能对某人有用(至少我希望如此):-)。
如果您担心密度平滑方法的边界效应,我建议使用 P 样条(参见 Eilers 和马克思,1991 - 作者在第 8 条中专门讨论了密度平滑中的边界偏差)。引用 Eilers 和马克思的话,
P样条密度平滑器不受边界效应的影响,例如内核平滑器。
通常,P 样条结合了 B 样条和有限差分惩罚。密度平滑问题是 GLM 的一个特例。所以我们只需要相应地参数化我们的平滑问题。
为了回答最初的问题,我将考虑以直方图方式分组的数据。我会用yi落在 bin/bar 中的观测值的计数(但推理也可以适应密度情况)ui. 为了平滑这些数据,我将使用以下成分:
- 更平滑:惠特克更平滑(P 样条的特殊情况,基是单位矩阵)
- 一阶差分惩罚
- IWLS 算法最大化我的惩罚可能性(参考中的 eq 36)
L=∑iyilogμi−∑iμi−λ∑i(Δ(1)ηi)2
和μi=exp(ηi).
结果由下面的代码生成,固定值为λ(我留下了一些评论,希望它更容易阅读)。正如您将在结果中注意到的那样,λ参数调节最终估计的平滑度。对于一个非常高λ我们得到了一条相当平坦的线。
library(colorout)
# Simulate data
set.seed(1)
N = 10000
x = runif(N)
# Construct histograms
his = hist(x, breaks = 50, plot = F)
X = his$counts
u = his$mids
# Prepare basis (I-mat) and penalty (1st difference)
B = diag(length(X))
D1 = diff(B, diff = 1)
lambda = 1e6 # fixed but can be selected (e.g. AIC)
P = lambda * t(D1) %*% D1
# Smooth
tol = 1e-8
eta = log(X + 1)
for (it in 1:20)
{
mu = exp(eta)
z = X - mu + mu * eta
a = solve(t(B) %*% (c(mu) * B) + P, t(B) %*% z)
etnew = B %*% a
de = max(abs(etnew - eta))
cat('Crit', it, de, '\n')
if(de < tol) break
eta = etnew
}
# Plot
plot(u, exp(eta), ylim = c(0, max(X)), type = 'l', col = 2)
lines(u, X, type = 'h')
最后,我希望我的建议足够清楚,并(至少部分地)回答原始问题。
