r - 找到局部最小值/最大值并仅使用此范围进行绘图

标签 r model-fitting

下面我有一些数据。请以 CSV 格式粘贴到文本文件中,因为我不知道如何将其导出为矢量:)

无论如何,当绘制散点图时,您会注意到有一个最大值。如何仅从 x = 0x = max(y) 范围进行拟合(在本例中只是线性,尽管不完全准确),然后从最大值到终点的另一个拟合(可能是指数衰减)?请参阅下面的草图。

enter image description here

time;intensity
0;2.17645
30;1.93959
60;2.66259
90;2.90125
120;2.5585
150;2.68808
180;3.06872
210;2.78406
240;3.03446
270;3.00371
300;2.92382
330;2.9213
360;2.86571
390;2.67248
420;2.48212
450;2.58491
480;2.53085
510;2.46214
540;2.38609
570;2.03002
600;1.8867
630;1.75795
660;1.69764
690;1.71163
720;1.59365
750;1.67867
780;1.59154
810;1.47798
840;1.43321
870;1.4091
900;1.32017
930;1.31044
960;1.28891
990;1.31004
1020;1.24349
1050;1.17192
1080;1.08548
1110;1.13026
1140;1.14576
1170;1.12595
1200;1.16716
1230;1.15284
1260;1.12913
1290;1.14195
1320;1.11694
1350;1.16297
1380;1.04345
1410;1.0932
1440;1.10847
1470;1.09431
1500;1.02416
1530;1.00733
1560;1.15768
1590;1.09288
1620;1.11773
1650;1.15572
1680;1.02918
1710;1.12721
1740;1.14438

最佳答案

使用ggplot2中的stat_smoothgeom_smooth来计算和绘制适合您的数据的数据,并使用subset函数来告诉他们数据的哪些部分适合:

library( ggplot2 )

X <- read.delim( "data.csv", sep=";" )
pt <- X$time[ which.max( X$intensity ) ]     # Identify the inflection point

g <- ggplot( X, aes( x=time, y=intensity ) ) +
  geom_point() +
  stat_smooth( data=subset( X, time<=pt ), method="lm", col="blue", se=FALSE ) +
  geom_smooth( data=subset( X, time>=pt ), method="glm", col="red", se=FALSE,
              method.args=list(family=gaussian(link="log")) )

请注意,指数衰减似乎不太适合您的数据:

enter image description here

关于r - 找到局部最小值/最大值并仅使用此范围进行绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42095728/

相关文章:

r - 根据不同列中的 NA 聚合列

r - R 中的非线性最小二乘法 - Levenberg Marquardt 以拟合 Heligman Pollard 模型参数

r - 如何在 zelig 中获取多重插补数据的模型拟合度(AIC、F 统计量)度量?

r - 如何根据坐标寻找最近的地方

r - 如何解决geom_segment中的箭头在plotly下无法显示

r - 在 R 中交换字符串与数字

r - 从 `lmermod` 对象中提取结果

python - 当 scipy.optimize.minimize 可能用于相同的事情时,为什么 scipy.optimize.least_squares 存在?

r - 'statsmodels' 或其他 Python 包是否提供等效于 R 的 'step' 函数?

r - 使用 nls 函数错误拟合