0

我是 R 的相对新手,不是数学家,而是遗传学家。我有很多组多对数据点。当它们被绘制出来时,它们会产生一条平坦的 S 曲线,其中大多数数据点最终都接近零标记。少数数据点飞得很远,形成了几乎两条 J 曲线,一条向下,一条向上。我需要找到数据急剧向上或向下变化的拐点。这可能是我的数学问题,但在我看来,如果我可以平滑曲线并将曲线拟合到直线并得到一个方程,那么我可以取曲线的二阶导数并确定二阶导数变化的拐点符号。我在 excel 中尝试过,并使用曲线来获得近似拟合以获得起始公式,但数据有点“摆动” 因此,即使我想手动完成所有操作(我不这样做),也无法确定任何一个拐点。我必须在其中找到这两个拐点的数百个数据集中的每一个都将产生大约相同的曲线,但拐点会略有不同,而精确地确定这些拐点对于问题来说绝对是至关重要的。因此,如果我可以在应该这样做的方程式中正确设置一次。为简单起见,我想将它们分成正曲线和负曲线,并分别进行。(也许 s 曲线有一些更简单的公式,这不是一个好主意?)我必须在其中找到这两个拐点的数百个数据集中的每一个都将产生大约相同的曲线,但拐点会略有不同,而精确地确定这些拐点对于问题来说绝对是至关重要的。因此,如果我可以在应该这样做的方程式中正确设置一次。为简单起见,我想将它们分成正曲线和负曲线,并分别进行。(也许 s 曲线有一些更简单的公式,这不是一个好主意?)我必须在其中找到这两个拐点的数百个数据集中的每一个都将产生大约相同的曲线,但拐点会略有不同,而精确地确定这些拐点对于问题来说绝对是至关重要的。因此,如果我可以在应该这样做的方程式中正确设置一次。为简单起见,我想将它们分成正曲线和负曲线,并分别进行。(也许 s 曲线有一些更简单的公式,这不是一个好主意?)

我已经尝试阅读手册,但由于我的数学能力较弱,这可能有点难以理解。我也找不到任何可以学习的类似例子。

这是我的数据集的头部: xy [1,] 1 0.00000000 [2,] 2 0.00062360 [3,] 3 0.00079720 [4,] 4 0.00085100 [5,] 5 0.00129020

(X 只是将 1 编号为许多数据点,并且 X 的数量会因单个集合而有所不同。)

据我所知,这是解决曲线拟合部分的问题:

pos_curve1 <- nls(curve_fitting ~ (scal*x^scal),data = cbind.data.frame(curve_fitting), + start = list(x = 0, scal = -0.01)) numericDeriv 错误(form[[3L] ], names(ind), env) :评估模型时产生的缺失值或无穷大另外:警告消息:1:在 min(x) 中:min 没有非缺失参数;返回 Inf 2:在 max(x) 中:max 没有非缺失参数;返回-Inf

我只是在艰难地做数学吗?我在 nls 上做错了什么?任何帮助将不胜感激。

4

1 回答 1

0

找到了。曲线是指数而不是 J,以下有效。

fit <- nls(pos ~ a*tmin^b, 
             data = d, 
             start = list(a = .1, b = .1), 
             trace = TRUE)

感谢 Jorge I Velez 在 R Help 2009 年 10 月 26 日

我还使用了 John Fox 和 Sanford Weisberg 上一次修订版 13:2010 年 12 月的“An Annex to An R Companion to Applied Regression, second edition”。

我的最终工作设置是:

适合 <- nls(y ~ a*log(10)^(x*b),pos_curve2,list(a = .01, b = .01), trace=TRUE)

我通过使用开放式办公室电子表格并测试各种曲线拟合选项来弄清楚公式应该是什么,直到我能够证明指数是最合适的。然后我从中得到了方程的结构。我使用 Fox & Sanford 的文章来了解设置参数的方式。

也许我并不孤单,但我真的发现很难弄清楚参数,而且很少有参考资料或问题对我有帮助。

于 2013-01-27T15:53:59.583 回答