L0 cezalarıyla düzeltmeyle hala ilgileniyorsanız, şu referansa bir göz atacağım: "Genomik Değişikliklerin L0 Cezası Kullanılarak Segmentlere Ayrılmış Düzeltme ile Görselleştirilmesi" - DOI: 10.1371 / journal.pone.0038230 (güzel bir Whittaker pürüzsüzlüğüne giriş P. Eilers kağıt "Mükemmel pürüzsüzlükte" - DOI: 10.1021 / ac034173t) bulunabilir. Elbette, hedefinize ulaşmak için yöntem etrafında biraz çalışmanız gerekir.
Prensip olarak 3 malzemeye ihtiyacınız var:
- Daha pürüzsüz - Whittaker'ı daha pürüzsüz kullanırdım. Ayrıca, matris büyütmeyi kullanacağım (bkz.Eilers ve Marx, 1996 - "B-spline'lar ile Esnek Düzeltme
ve Cezalar ", s.101).
- Nicelik regresyonu - Tembellik için R paketi quantreg (rho = 0.5) kullanacağım :-)
- L0-ceza - Bahsedilen "Genomik Değişikliklerin L0 Cezası Kullanılarak Segmentlere Ayrılmış Düzeltme ile Görselleştirilmesi" ni takip edeceğim - DOI: 10.1371 / journal.pone.0038230
Elbette, en uygun düzleştirme miktarını seçmenin de bir yolunu bulmanız gerekir. Bu örnek için marangoz gözlerim tarafından yapıldı. DOI: 10.1371 / journal.pone.0038230'daki ölçütleri kullanabilirsiniz (sf. 5, ancak sizin örneğinizde denemedim).
Aşağıda küçük bir kod bulacaksınız. Yol göstermesi için bazı yorumlar bıraktım.
# Çapraz Doğrulanmış örnek
rm (liste = ls ()); graphics.off (); kedi ("\ 014")
kitaplık (eğri çizgiler)
kütüphane (Matrix)
kütüphane (quantreg)
# Veri
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 (uzunluk (x), df = 1)
# Bazları hazırlayın - Kimlik matrisi (Whittaker)
# B-spline'lar için değiştirilebilir
B = diag (1, n, n)
# Ceza hazırlayın - lambda parametresi düzeltmesi
nb = ncol (B)
D = fark (diag (1, nb, nb), fark = 1)
lambda = 1e2
# Standart Whittaker'ı çözün - başlangıç değerleri için
a = çöz (t (B)% *% B + çapraz kanal (D), t (B)% *% y, tol = 1e-50)
DOI: 10.1371 / journal.pone.0038230'daki gibi L0-Diff cezalı tahmini döngü
p = 1e-6
nit = 100
beta = 1e-5
for (it in 1: nit) {
ao = a
# Ceza ağırlıkları
w = (c (D% *% a) ^ 2 + beta ^ 2) ^ ((p - 2) / 2)
W = diag (c (w))
# Matris büyütme
cD = lambda * sqrt (W)% *% D
Bp = rbind (B, cD)
yp = c (y, 1: nrow (cD) * 0)
# Katsayıları güncelle - Quantreg'den rq.fit
a = rq.fit (Bp, yp, tau = 0.5) $ coef
# Yakınsamayı kontrol edin ve güncelleyin
da = max (abs ((a - ao) / ao))
kedi (o, da, '\ n')
eğer (da < 1e-6) kırılırsa
}
# Uygun
v = B% *% a
# Sonuçları göster
arsa (x, y, pch = 16, cex = 0.5)
çizgiler (x, y, col = 8, lwd = 0.5)
çizgiler (x, v, col = 'blue', lwd = 2)
çizgiler (x, true_fct (x), col = 'red', lty = 2, lwd = 2)
açıklama ("topright", açıklama = c ("Gerçek Sinyal", "Düzleştirilmiş sinyal"),
col = c ("kırmızı", "mavi"), lty = c (2, 1))
PS.Bu, Çapraz Doğrulamayla ilgili ilk cevabım.Umarım yeterince yararlı ve anlaşılırdır :-)