簡體   English   中英

曲線上的擬合分布

[英]Fitting distribution on curve

我正在嘗試將曲線擬合到點以計算最大值以及中心。

我有二維數據(x和y軸)以及我使用的包pracmafindpeak函數來檢測在該矩陣中的峰。

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.09712y=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM