2017-05-03 44 views
2

我想适合一个模型/找到一个使用70系列的功能形式。我每个人都有30个值。情节显示趋势不是线性的,所以我试图使用NLS。 the data looks like this寻找NLS多重系列

不知道这是否正确。我以前没有实现过。我应该使用别的东西来建模吗?我收到以下错误:

Error in nls(y ~ a * exp(b * x), start = list(a = a_start, b = b_start)) :
singular gradient

x的值为1:30,重复70次。 Y值在0和1之间变化。我应该使用71个矢量(长度为30)还是应该将它们全部收集在两列中。目前,我已经把它们全部分成两列。

的数据看起来是这样的:


a_start<-0.2 
b_start<-2*log(2)/a_start 

请询问进一步的澄清,如果我的问题不明确。任何帮助将不胜感激。

+0

我与'nls'相对缺乏经验,但我已经用它的时候,最棘手的部分之一是向它的初始值是足够接近以便它可以找到解决方案。我不确定这个错误是否相关,但是这对于试图自动化配合许多系列来说是一个问题。为此,您可以查看自启动模型。参见'?selfStart'和链接。 – lmo

+0

尝试取双方的日志并使用lm进行拟合,然后将结果转换为初始值,或者lm对于您自己已足够。 –

回答

0

问题是您的公式不是准确反映您的数据的表单。 y〜a * exp(b * x)永远不会看起来像你的数据,所以你会得到明显的渐变,这是没有任何意义的。

试试这个:

#some made up data, since none provided 
x <- runif(1000) * 30 
y <- -0.9 * exp(-0.5 * x) + 1.1 + rnorm(length(x), sd=0.1) 

fit <- nls(y ~ a * exp(b * x) + c, start = list(a = -1, b=-.1, c=1)) 

plot(x,y) 
lines(x[order(x)], predict(fit)[order(x)], col="red", lwd=4) 

enter image description here

+0

谢谢@thc。我明白,错误是因为功能不正确。使用你指定的功能,我确实适合。我想要开始接近0.2。可能,我需要玩这些参数来达到预期的效果。 – NKaz

+0

@NKaz,很高兴它有帮助。我建议的功能只是一个基于数据形状的例子。我建议试图找出一个从科学的角度来看有意义的等式。模型中的所有参数都应该具有科学意义。 – thc

+0

你能否建议任何阅读/链接科学地找到使用数据的非线性方程。我曾尝试使用y值的日志并应用lm。但残差是自动关联的。我尝试过的其他事情是nls2(蛮力)。但它是关于找到一个更好的参数值 - 基于我指定的公式。 – NKaz