Próbuję znaleźć lokalne maksima dla funkcji gęstości prawdopodobieństwa (znalezionej metodą R density
). Nie mogę wykonać prostej metody „rozglądania się po sąsiadach” (gdzie ktoś rozgląda się po punkcie, aby sprawdzić, czy jest to maksimum lokalne w stosunku do swoich sąsiadów), ponieważ istnieje duża ilość danych. Co więcej, wydaje się bardziej wydajne i ogólne użycie czegoś takiego jak interpolacja splajnu, a następnie znalezienie pierwiastków pierwszej pochodnej, w przeciwieństwie do budowania „rozejrzenia się po sąsiadach” z tolerancją na awarie i innymi parametrami.
Więc moje pytania:
- Biorąc pod uwagę funkcję
splinefun
, jakie metody znajdą lokalne maksima? - Czy istnieje prosty / standardowy sposób na znalezienie pochodnych funkcji zwracanych za pomocą
splinefun
? - Czy istnieje lepszy / standardowy sposób na znalezienie lokalnych maksimów funkcji gęstości prawdopodobieństwa?
Dla porównania poniżej znajduje się wykres mojej funkcji gęstości. Inne funkcje gęstości, z którymi pracuję, mają podobną formę. Powinienem powiedzieć, że jestem nowy w R, ale nie nowy w programowaniu, więc może istnieć standardowa biblioteka lub pakiet do osiągnięcia tego, czego potrzebuję.
Dzięki za pomoc!!
density()
nie szacuje gęstości dla każdego układu odniesienia, szacuje gęstość przy wartościach n , gdzie n jest parametrem określonym przez użytkownika o wartości domyślnej n = 512.msExtrema {msProcess}
) i byłem w stanie zidentyfikować tylko niektóre maksima, nigdy nie wszystkie, grając z ustawieniami tolerancji.msExtrema
, jest to proste opakowaniepeaks
zsplus2R
pakietu, którego lepiej byłoby użyć bezpośrednio, jeśli chcesz tylko lokalne maksima, a nie lokalne minima. Nie rozumiem, dlaczego użycie wartości domyślnejspan=3
nie znalazłoby wszystkich lokalnych maksimów. A 2 ^ 15 = 32768 nie powinno być wystarczająco duże, aby wydajność była dużym zmartwieniem.peaks
wydaje się być wadliwy: Wywołujemax.col
z domyślnym ustawieniemties.method = "random"
, które nie tylko losowo zrywa więzi, ale także ustawia względną tolerancję 1e-5 dla deklaracji remisu. Pierwsze jest mylące, drugie zdecydowanie nie jest tym, czego chcesz tutaj.peaks()
bierze równieżstrict
parametr, który jest słabo udokumentowany i patrząc na kod funkcji nic nie robi. Ach, radości z bibliotek oprogramowania tworzonych przez użytkowników! Być może będziesz w stanie to naprawić, ponieważ mówisz, że nie jesteś nowy w programowaniuOdpowiedzi:
To, co chcesz zrobić, nazywa się wykrywaniem pików w chemometrii. Można do tego użyć różnych metod. Pokazuję tu tylko bardzo proste podejście.
źródło