我有这种格式的时间序列数据集:
Time Val1 Val2
0 0.68 0.39
30 0.08 0.14
35 0.12 0.07
40 0.17 0.28
45 0.35 0.31
50 0.14 0.45
100 1.01 1.31
105 0.40 1.20
110 2.02 0.57
115 1.51 0.58
130 1.32 2.01
使用此数据集我想提取(不预测)FC1 = 1且FC2 = 1的时间。这是我用我想要提取的注释点创建的图。
我正在寻找使用或函数插值/截取来提取值的解决方案。例如,如果我在折叠变化1处绘制一条直线(比如在y轴上),我想要提取X轴上线截取的所有点。
期待提前建议并提前致谢!
答案 0 :(得分:2)
您可以使用approxfun
进行插值,使用uniroot
查找单个根(线穿过的位置)。您需要多次运行uniroot才能找到所有交叉点,rle
函数可能有助于选择起点。
数据中的FC值永远不会接近1,更不用说跨越它,因此您必须拥有比显示的数据更多的数据,或者表示不同的值。
如果您可以提供更多详细信息(可能包含显示您想要的图表),那么我们可能会提供更详细的帮助。
修改强>
好的,这里有一些R代码可以找到线交叉的位置:
con <- textConnection(' Time Val1 Val2
0 0.68 0.39
30 0.08 0.14
35 0.12 0.07
40 0.17 0.28
45 0.35 0.31
50 0.14 0.45
100 1.01 1.31
105 0.40 1.20
110 2.02 0.57
115 1.51 0.58
130 1.32 2.01')
mydat <- read.table(con, header=TRUE)
with(mydat, {
plot( Time, Val1, ylim=range(Val1,Val2), col='green', type='l' )
lines(Time, Val2, col='blue')
})
abline(h=1, col='red')
afun1 <- approxfun( mydat$Time, mydat$Val1 - 1 )
afun2 <- approxfun( mydat$Time, mydat$Val2 - 1 )
points1 <- cumsum( rle(sign(mydat$Val1 - 1))$lengths )
points2 <- cumsum( rle(sign(mydat$Val2 - 1))$lengths )
xval1 <- numeric( length(points1) - 1 )
xval2 <- numeric( length(points2) - 1 )
for( i in seq_along(xval1) ) {
tmp <- uniroot(afun1, mydat$Time[ points1[c(i, i+1)] ])
xval1[i] <- tmp$root
}
for( i in seq_along(xval2) ) {
tmp <- uniroot(afun2, mydat$Time[ points2[c(i, i+1)] ])
xval2[i] <- tmp$root
}
abline( v=xval1, col='green' )
abline( v=xval2, col='blue')