我认为这很简单,但我遇到了真正的困难。我可以使用excel或R,无论它做什么。我只需要知道这些曲线何时通过某个值。
我尝试在我的图表中添加一行,以查看是否存在交叉函数但没有。
Years Y
10 0
20 0
50 5.54
100 21.81
200 46.24
500 71.96
1000 84.74
1500 89.63
2000 91.94
我需要知道这条曲线在哪里穿过90
Years Y
10 1
20 0.96
50 0.28
100 0
200 0
500 0
1000 0
1500 0
2000 0
我需要知道这条曲线在哪里超过0.01
编辑以防万一(不是来自OP):
答案 0 :(得分:2)
如果适合设置逆模型$ x = f(y)$,例如Years ~ Y
,您可以构建和评估它。 (但考虑反向建模的后果。)
?approx
。?predict
是您的朋友。 以下是您的第一个数据集(使用loess
)的经典和反向建模之间差异的示例:
古典:
逆:
由于逆模型假定年份为“>>在Y上的误差,Y = 90线越过在约为0的模型拟合的95%置信区间。对于逆模型,年= 1375和1900。对于经典模型,假设Y上的误差占主导地位。在这种情况下,所有年份都超过ca. 800在拟合的95%置信区间内,并且置信区间第一次几乎接触Y = 90线,年龄= 350左右。
请注意,点估计也有所不同:Y = 90与大约的经典拟合相交。 1435,而反向拟合在1635处交叉。
(当然你可能想要一个更具限制性的模型)
答案 1 :(得分:1)
您需要做的第一件事是决定如何使曲线适合您的数据。有很多方法可以做到这一点,显然答案取决于你的选择。如果通过“曲线”你只是意味着线性插值(即“连接点”),那么像这样的函数将在第一次超过阈值时找到:
findCross<-function(years, y, value){
over <- y > value
w <- which(over != over[1])[1]
frac <- (value - y[w-1]) / (y[w] - y[w-1])
years[w-1] + (years[w] - years[w-1]) * frac
}
答案 2 :(得分:1)
我会使用线性,多项式或非线性拟合来拟合数据,以最适合您的数据和目的。然后使用您创建的拟合函数并运行
uniroot(fit_fun-90,upperbound,lowerbound)
编辑 - 托马斯评论:
任何R
拟合工具(如lm
或nls
)的结果都包含拟合函数中所有项的系数。例如,对于简单的线性拟合,提供斜率和截距。有了这些信息,请创建一个新的fit_fun<-function(x) {intercept + slope*x}
。
减去90
的原因是uniroot
寻找“根”,即零值,所以我基本上对函数应用了一个偏移量。有关详细信息,请参阅?uniroot
。