それでもL0ペナルティによるスムージングに関心がある場合は、次のリファレンスを参照してください。「L0ペナルティを使用したセグメント化されたスムージングによるゲノム変化の視覚化」-DOI:10.1371 / journal.pone.0038230( Whittakerのスムーザーは、P。Eilersの論文「A perfect perfecter」-DOI:10.1021 / ac034173tにあります。もちろん、あなたの目的を達成するためには、メソッドの周りに少し取り組む必要があります。
原則として、3つの成分が必要です。
- よりスムーズ-Whittakerをよりスムーズに使用します。また、行列拡張を使用します(Eilers and Marx、1996-「Bスプラインとペナルティによる柔軟な平滑化」、p.101を参照)。
- クォンタイル回帰-怠惰にはRパッケージのquantreg(rho = 0.5)を使用します:-)
- L0-ペナルティ-私は前述の「L0ペナルティを使用したセグメント化されたスムージングによるゲノム変化の可視化」に従います-DOI:10.1371 / journal.pone.0038230
もちろん、最適な平滑化量を選択する方法も必要です。これは、この例では大工の目で行われます。DOIの基準を使用することができます:10.1371 / journal.pone.0038230(5ページですが、私はあなたの例では試しませんでした)。
以下に小さなコードがあります。ガイドとしてコメントを残しました。
# Cross Validated example
rm(list = ls()); graphics.off(); cat("\014")
library(splines)
library(Matrix)
library(quantreg)
# The data
set.seed(20181118)
n = 400
x = 1:n
true_fct = stepfun(c(100, 200, 250), c(200, 250, 300, 250))
y = true_fct(x) + rt(length(x), df = 1)
# Prepare bases - Identity matrix (Whittaker)
# Can be changed for B-splines
B = diag(1, n, n)
# Prepare penalty - lambda parameter fix
nb = ncol(B)
D = diff(diag(1, nb, nb), diff = 1)
lambda = 1e2
# Solve standard Whittaker - for initial values
a = solve(t(B) %*% B + crossprod(D), t(B) %*% y, tol = 1e-50)
# est. loop with L0-Diff penalty as in DOI: 10.1371/journal.pone.0038230
p = 1e-6
nit = 100
beta = 1e-5
for (it in 1:nit) {
ao = a
# Penalty weights
w = (c(D %*% a) ^ 2 + beta ^ 2) ^ ((p - 2)/2)
W = diag(c(w))
# Matrix augmentation
cD = lambda * sqrt(W) %*% D
Bp = rbind(B, cD)
yp = c(y, 1:nrow(cD)*0)
# Update coefficients - rq.fit from quantreg
a = rq.fit(Bp, yp, tau = 0.5)$coef
# Check convergence and update
da = max(abs((a - ao)/ao))
cat(it, da, '\n')
if (da < 1e-6) break
}
# Fit
v = B %*% a
# Show results
plot(x, y, pch = 16, cex = 0.5)
lines(x, y, col = 8, lwd = 0.5)
lines(x, v, col = 'blue', lwd = 2)
lines(x, true_fct(x), col = 'red', lty = 2, lwd = 2)
legend("topright", legend = c("True Signal", "Smoothed signal"),
col = c("red", "blue"), lty = c(2, 1))
PS。これは、相互検証に関する私の最初の回答です。私はそれが便利で十分明確であることを願っています:-)