0

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

4

3 回答 3

2

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

  • 对于线性近似,请查看?approx.
  • 如果您需要特定类型的模型,那么也许您可以将逆模型设置为您请求的依赖项,那么 ?predict就是您的朋友。

这是第一个数据集的经典和逆向建模之间差异的示例(带有loess):

古典:
经典模型

逆:
逆模型

由于逆模型假设 Years 上的误差为 >> Y 上的误差,Y = 90 线在 ca 处穿过模型拟合的 95% 置信区间。对于逆模型,年份 = 1375 和 1900。对于经典模型,假设 Y 上的误差占主导地位。在这种情况下,所有年份都高于 ca。800 在拟合的 95% 置信区间内,置信区间几乎第一次在 Years = 350 附近触及 Y = 90 线。
请注意,点估计值也有所不同:Y = 90 在 ca 处与经典拟合相交。1435,而反向拟合在 1635 交叉。

(当然你可能想要一个更严格的模型)

于 2013-09-25T14:34:44.907 回答
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
}
于 2013-09-25T14:17:10.350 回答
1

我会使用最适合您的数据和目的的线性、多项式或非线性拟合来拟合数据。然后使用您创建并运行的 fit 函数

uniroot(fit_fun-90,upperbound,lowerbound)

编辑 - 托马斯的评论:任何R拟合工具的结果,例如lmnls包括拟合函数中所有项的系数。例如,对于简单的线性拟合,提供了斜率和截距。使用此信息,创建一个新的fit_fun<-function(x) {intercept + slope*x}.

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

于 2013-09-25T14:23:13.673 回答