下面我有一些数据。请粘贴到CSV文本文件中,因为我无法弄清楚如何将其导出为矢量:)
无论如何,当散点图时你会注意到最大值。我怎样才能从x = 0
到x = max(y)
范围内进行拟合(在这种情况下只是一个线性的,虽然不完全准确),然后从最大值到结束另一个拟合(可能是指数衰减)点?见下面的草图。
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
答案 0 :(得分:2)
使用stat_smooth
中的geom_smooth
和ggplot2
计算并绘制适合您数据的内容,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")) )
请注意,指数衰减似乎不适合您的数据:
答案 1 :(得分:1)
最简单的方法是在发生最大值时将数据分成两部分,并将它们单独拟合?
这可以通过以下代码来实现;
data <- read.csv('./in.csv')
max <- which.max(data$intensity)
start <- data[1:max,]
end <- data[max:dim(data)[1],]
which
只返回达到最大值的索引,并在其上拆分,dim
返回数据帧的形状,我们选择行数。
如果您希望平滑数据顶部而不使用explict最大值,可以使用rollaply here进行一个很好的示例。