我的曲线超过某个阈值的地方

时间:2013-09-25 13:40:58

标签: r excel intersection curve

我认为这很简单,但我遇到了真正的困难。我可以使用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):

SO19006597 question example

3 个答案:

答案 0 :(得分:2)

如果适合设置逆模型$ x = f(y)$,例如Years ~ Y,您可以构建和评估它。 (但考虑反向建模的后果。)

  • 对于线性近似,请查看?approx
  • 如果您需要特定类型的模型,那么您可以根据您请求的依赖关系设置逆模型,然后?predict是您的朋友。

以下是您的第一个数据集(使用loess)的经典和反向建模之间差异的示例:

古典:
classical model

逆:
inverse model

由于逆模型假定年份为“>>在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拟合工具(如lmnls)的结果都包含拟合函数中所有项的系数。例如,对于简单的线性拟合,提供斜率和截距。有了这些信息,请创建一个新的fit_fun<-function(x) {intercept + slope*x}

减去90的原因是uniroot寻找“根”,即零值,所以我基本上对函数应用了一个偏移量。有关详细信息,请参阅?uniroot