【发布时间】:2014-09-11 13:09:57
【问题描述】:
我的数据集:
mydata<-structure(list(t = c(0.208333333, 0.208333333, 0.208333333, 0.208333333,
1, 1, 1, 1, 2, 2, 2, 2, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16,
16, 16, 0.208333333, 0.208333333, 0.208333333, 0.208333333, 1,
1, 1, 1, 2, 2, 2, 2), parent = c(1.2, 1.4, 0.53, 1.2, 1, 0.72,
0.93, 1.1, 0.88, 0.38, 0.45, 0.27, 0.057, 0.031, 0.025, 0.051,
0.027, 0.015, 0.034, 0.019, 0.017, 0.025, 0.024, 0.023, 0.29,
0.22, 0.34, 0.19, 0.12, 0.092, 0.41, 0.28, 0.064, 0.05, 0.058,
0.043)), .Names = c("t", "Ct"), row.names = c(325L, 326L,
327L, 328L, 341L, 342L, 343L, 344L, 357L, 358L, 359L, 360L, 373L,
374L, 375L, 376L, 389L, 390L, 391L, 392L, 401L, 402L, 403L, 404L,
805L, 806L, 807L, 808L, 821L, 822L, 823L, 824L, 837L, 838L, 839L,
840L), class = "data.frame")
要拟合的函数是曲棍球曲线;即它在弯曲点 tb 之后变平:
hockeystick<-function (t, C0, k1, k2, tb)
{
Ct = ifelse(t <= tb, C0 -k1 * t, C0 -k1*tb -k2*t)
}
使用 nls 拟合:
start.hockey<-c(C0=3,k1=1,k2=0.1,tb=3)
nls(log(Ct)~hockeystick(t,C0,k1,k2,tb),start=start.hockey,data=mydata)
无论我使用什么起始值,我总是得到这个错误:
Error in nlsModel(formula, mf, start, wts) :
singular gradient matrix at initial parameter estimates
我尝试了port 和标准的nls 方法。我尝试了模型的线性化(如图所示)和正常状态,但似乎都不起作用。
编辑:根据 Carl 的建议,我尝试将模型拟合到一个数据集,在该数据集中我首先对每个 t 值的 Ct 值进行平均,但仍然得到错误。
编辑:稍微改变了模型,所以k2 的值是正的而不是负的。负值在动力学上没有意义。
【问题讨论】:
-
尝试绘制
hockeystick(mydata$t,C0,k1,k2,tb)与mydata$t。这不是曲棍球棒。此外,t的重复值几乎肯定会导致回归失败。 -
所以一般来说,我最好将回归拟合到每个 t 值的平均值?曲棍球棒是线性化的,所以 y 轴是对数单位。
-
tb 是曲棍球模型的“弯曲点”,即曲线改变其“下降率”的点。
标签: r curve-fitting nls