[英]Fitting distribution on curve
我正在嘗試將曲線擬合到點以計算最大值以及中心。
我有二維數據(x和y軸)以及我使用的包pracma
與findpeak
函數來檢測在該矩陣中的峰。
peak <- structure(c(86.0953485633098, 86.0955380284491, 86.0957274942138,
86.095916960604, 86.0961064276196, 86.0962958952606, 86.096485363527,
86.0966748324189, 86.0968643019362, 86.0970537720789, 86.097243242847,
86.0974327142406, 86.0976221862597, 86.0978116589041, 86.0980011321741,
86.0981906060695, 86.0983800805903, 86.0985695557366, 0, 178.362274169922,
1118.56115722656, 1993.09130859375, 2681.42016601562, 3771.77612304688,
12054.2744140625, 41142.8828125, 82771.796875, 126647.4296875,
124873.390625, 80395.8046875, 38812.58203125, 11192.2685546875,
3193.95947265625, 1768.93249511719, 487.752838134766, 0),
.Dim = c(18L, 2L))
pracma::findpeaks(peak[,2])
plot(peak)
我的問題是, findpeak
僅給出了數據點內的最大值,但是我想通過繪制每個人都可以想象得出,最大值要高一點,並且在不同的y坐標上。 我期望的大致是x=86.09712
和y=12750.00
……類似的東西。
我也找到了MASS::fitdistr
但這僅適用於發行版,不適用於我的數據。 我想我的問題已經被問到了,但是我找不到解決方案,也許我錯過了要搜索的正確詞匯。
一種方法是創建模型,然后使用predict
在您知道其高的范圍內找到擬合值,在該范圍內可以使用which.max
找到which.max
:
peak <- structure(c(86.0953485633098, 86.0955380284491, 86.0957274942138,
86.095916960604, 86.0961064276196, 86.0962958952606, 86.096485363527,
86.0966748324189, 86.0968643019362, 86.0970537720789, 86.097243242847,
86.0974327142406, 86.0976221862597, 86.0978116589041, 86.0980011321741,
86.0981906060695, 86.0983800805903, 86.0985695557366, 0, 178.362274169922,
1118.56115722656, 1993.09130859375, 2681.42016601562, 3771.77612304688,
12054.2744140625, 41142.8828125, 82771.796875, 126647.4296875,
124873.390625, 80395.8046875, 38812.58203125, 11192.2685546875,
3193.95947265625, 1768.93249511719, 487.752838134766, 0),
.Dim = c(18L, 2L))
df_peak <- as.data.frame(peak)
names(df_peak) <- c('x', 'y')
# use any model that nicely fits your data
model <- mgcv::gam(y ~ s(x), data = df_peak)
df_peak$fitted <- predict(model)
max_zone_x <- df_peak$x[tail(order(df_peak$fitted))]
max_zone <- data.frame(x = seq(max_zone_x[1], max_zone_x[2], length.out = 1000))
max_zone$y <- predict(model, max_zone)
max_zone[which.max(max_zone$y), ]
#> x y
#> 507 86.09714 129699.8
這種方法僅限於一次找到一個峰值,但是信號處理領域可能有更健壯的替代方法來處理多峰數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.