Spline kullanarak yoğunluk fonksiyonunun lokal ekstremalarını bulma


15

Bir olasılık yoğunluk fonksiyonu için yerel maxima bulmaya çalışıyorum (R densityyöntemi kullanılarak bulundu ). Basit bir "komşuların etrafına bakın" yöntemi (burada komşularına göre yerel bir maksimum olup olmadığını görmek için bir noktaya bakar) yapamıyorum çünkü büyük miktarda veri var. Ayrıca, Spline enterpolasyonu gibi bir şey kullanmak ve daha sonra hata toleransı ve diğer parametrelerle bir "komşuların etrafına bakın" ın aksine, 1. türevin köklerini bulmak daha verimli ve genel görünüyor.

Sorularım:

  1. Bir işlev verildiğinde splinefun, yerel maksimumları hangi yöntemler bulacaktır?
  2. Kullanarak döndürülen bir işlevin türevlerini bulmanın kolay / standart bir yolu var mı splinefun?
  3. Olasılık yoğunluğu fonksiyonunun yerel maksimum değerini bulmanın daha iyi / standart bir yolu var mı?

Referans olarak, aşağıda yoğunluk fonksiyonumun bir çizimi verilmiştir. Üzerinde çalıştığım diğer yoğunluk işlevleri de benzer. R için yeni olduğumu, ancak programlama konusunda yeni olmadığımı söylemeliyim, bu yüzden ihtiyacım olanı elde etmek için standart bir kütüphane veya paket olabilir. Yoğunluk fonksiyonu

Yardımın için teşekkürler!!


Büyük hacimli verilerin neden 'komşulara bak' yöntemi için bir sorun olduğu net değil. density()her veri için yoğunluğu tahmin etmez, n değerlerindeki yoğunluğu tahmin eder ; burada n , varsayılan değer n = 512 olan kullanıcı tarafından belirlenen bir parametredir.
onestop

Bunun için benim n 2 ^ 15 ve verilerin nokta nokta düzeyinde çok fazla varyans olduğu görülüyor. Komşuluklar yöntemine benzer bir şey kullanarak bir max / min bulucu yazmaya çalıştım (üzerinden msExtrema {msProcess}) ve tolerans ayarları ile oynayarak sadece maksimumları, asla hepsini tanımlayabildim.
aaronlevin

2
Koduna bakıldığında , paketten gelen msExtremabasit bir sarıcıdır ; bu, yerel minima değil, yalnızca yerel maxima'yı istiyorsanız doğrudan kullanmaktan daha iyi olur. Neden varsayılanı kullanmanın tüm yerel maksimumları bulamadığını göremiyorum . Ve 2 ^ 15 = 32768, verimliliğin büyük bir endişe olabileceği kadar büyük olmamalıdır. peakssplus2Rspan=3
onestop

Splinefun tarafından döndürülen işlev, varsayılan olarak 0 olan "deriv" ​​bağımsız değişkenine sahiptir. İlk türev için deriv = 1 olarak ayarlayın.
Camgöbeği

1
Hmm, peaksbuggy gibi görünüyor: max.colVarsayılan ayarı ile çağırıyor ties.method = "random", sadece rastgele bağları koparmakla kalmıyor, aynı zamanda bir kravat bildirmek için 1e-5'e göreceli bir tolerans da ayarlıyor. İlki kafa karıştırıcı, ikincisi kesinlikle burada istediğiniz şey değil. peaks()ayrıca strictkötü belgelenmiş bir parametre alır ve işlevin koduna bakarak hiçbir şey yapmaz. Ah, kullanıcı katkısı olan yazılım kütüphanelerinin sevinci! Programlamaya yeni olmadığınızı söylediğiniz gibi, düzeltebilirsiniz
onestop

Yanıtlar:


14

Yapmak istediğiniz şeye kemometride tepe tespiti denir. Bunun için kullanabileceğiniz çeşitli yöntemler vardır. Burada sadece çok basit bir yaklaşım sergiliyorum.

require(graphics)
#some data
d <- density(faithful$eruptions, bw = "sj")

#make it a time series
ts_y<-ts(d$y)

#calculate turning points (extrema)
require(pastecs)
tp<-turnpoints(ts_y)
#plot
plot(d)
points(d$x[tp$tppos],d$y[tp$tppos],col="red")

Tüm çözümlerden en iyisi bu oldu. 1. Takip eden soru: toleransları dönüş noktaları ile değiştirmenin bir yolu var mı? Yoğunluk fonksiyonunun uzun kuyruk kısmında çok sayıda Zirve ve Vadi bulundu. 2. Takip eden soru # 2: Toleransı belirlemenin iyi bir yolu nedir?
aaronlevin

ad 1. Ben öyle düşünmüyorum. Zaman serisinin rasgeleliğini test etmek için tasarlanmıştır, bu nedenle işlevin buna ihtiyacı yoktur. Bir zirvenin alaka düzeyini / önemini kendiniz test etmeye çalışabilirsiniz. Örneğin, mahalleye karşı bir t testi yapabilirsiniz (mahallenin ne kadar büyük olması gerektiğine karar verebilirsiniz). Veya (kütle) spektrometri veya diğer analitik kimya yöntemlerinden gelen verilerin değerlendirilmesi için R paketlerinde daha sofistike bir fonksiyon arayabilirsiniz.
Roland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.