我正在尝试将数据拟合到非线性模型,但我得到的是#34;奇异渐变"构建模型时的消息。
这是数据:
> astrodata
temperature intensity
1 277.15 121
2 282.15 131
3 287.15 153
4 292.15 202
5 297.15 311
功能:
y= a * exp(-b * temperature) + c
到目前为止我做了什么:
> temperature <- astrodata$temperature
temperature
[1] 277.15 282.15 287.15 292.15 297.15
> intensity <- astrodata$intensity
> c.0 <- min(temperature)*0.5
> c.0 <- min(intensity)*0.5
> model.0 <- lm(log(intensity - c.0) ~ temperature, data=astrodata)
> start <- list(a=exp(coef(model.0)[1]), b=coef(model.0)[2], c=c.0)
>
> model <- nls(intensity ~ a * exp(-b * temperature) + c, data = astrodata, start = start)
Error in nls(intensity ~ a * exp(b * temperature) + c, data = astrodata, :
singular gradient
有人知道如何解决这个问题吗?
答案 0 :(得分:1)
该模型在a
和c
中呈线性,在b
中仅为非线性。这表明我们尝试"plinear"
算法。它的优点是只有非线性参数需要起始值。
请注意,该算法的公式规范不同,并且RHS是一个矩阵,每个线性参数有一列。
model <- nls(intensity ~ cbind(exp(-b * temperature), 1), data = astrodata,
start = start["b"], algorithm = "plinear")
,并提供:
> model
Nonlinear regression model
model: intensity ~ cbind(exp(-b * temperature), 1)
data: astrodata
b .lin1 .lin2
-1.598e-01 4.728e-19 1.129e+02
residual sum-of-squares: 0.003853
Number of iterations to convergence: 5
Achieved convergence tolerance: 2.594e-07
此外:
plot(intensity ~ temperature, astrodata)
lines(fitted(model) ~ temperature, astrodata)
注意:根据以下评论,您实际上并不需要nls
模型,只需使用geom_line
p <- ggplot(astrodata, aes(temperature, intensity)) + geom_point()
p + geom_line()
或splines:
p + geom_line(data = data.frame(spline(temperature, intensity)), aes(x, y))
答案 1 :(得分:0)
您的数据不够多。
nls使用least squares工作。这是模型和数据点之间距离的度量。如果没有距离,nls就不起作用了。您的模型完全符合数据,这称为&#34; zero-residual&#34;数据。因此
初始参数估计时的奇异梯度矩阵。
这是一个过于复杂的错误消息,仅仅意味着&#34;没有错误要衡量。&#34;
您只有5个(x,y)
个组合,因此使用非线性分析几乎可以保证这个错误。使用不同的数据或更多数据。
答案 2 :(得分:0)
一种可能性是将每个数据点加倍,为加倍数据添加非常微小的变化,如下所示:
temperature intensity
1 277.15 121
2 282.15 131
3 287.15 153
4 292.15 202
5 297.15 311
11 277.15000001 121.000001
12 282.15000001 131.000001
13 287.15000001 153.000001
14 292.15000001 202.000001
15 297.15000001 311.000001
在原始数据集中,每个点实际上具有相同的权重1.0,并且在“加倍”数据集中,每个点实际上具有相同的权重2.0,因此您获得相同的拟合参数值但没有错误。 / p>