使用 nls 函数错误拟合
Posted
技术标签:
【中文标题】使用 nls 函数错误拟合【英文标题】:Wrong Fit using nls function 【发布时间】:2017-12-25 08:51:19 【问题描述】:当我尝试拟合指数衰减并且我的 x 轴有十进制数时,拟合永远不会正确。以下是我的数据:
exp.decay = data.frame(time,counts)
time counts
1 0.4 4458
2 0.6 2446
3 0.8 1327
4 1.0 814
5 1.2 549
6 1.4 401
7 1.6 266
8 1.8 182
9 2.0 140
10 2.2 109
11 2.4 83
12 2.6 78
13 2.8 57
14 3.0 50
15 3.2 31
16 3.4 22
17 3.6 23
18 3.8 20
19 4.0 19
20 4.2 9
21 4.4 7
22 4.6 4
23 4.8 6
24 5.0 4
25 5.2 6
26 5.4 2
27 5.6 7
28 5.8 2
29 6.0 0
30 6.2 3
31 6.4 1
32 6.6 1
33 6.8 2
34 7.0 1
35 7.2 2
36 7.4 1
37 7.6 1
38 7.8 0
39 8.0 0
40 8.2 0
41 8.4 0
42 8.6 1
43 8.8 0
44 9.0 0
45 9.2 0
46 9.4 1
47 9.6 0
48 9.8 0
49 10.0 1
fit.one.exp <- nls(counts ~ A*exp(-k*time),data=exp.decay, start=c(A=max(counts),k=0.1))
plot(exp.decay, col='darkblue',xlab = 'Track Duration (seconds)',ylab = 'Number of Particles', main = 'Exponential Fit')
lines(predict(fit.one.exp), col = 'red', lty=2, lwd=2)
我总是得到这种奇怪的配合。在我看来,拟合无法识别正确的 x 轴,因为当我使用不同的数据集时,x 轴(时间)中只有整数,拟合有效!我不明白为什么它与不同的单位不同。
【问题讨论】:
因为这是您的第一个问题:请不要忘记点赞有用的答案,并点击答案旁边的绿色勾号接受最好的答案;然后支票变成绿色 【参考方案1】:你需要做一个小的修改:
lines(predict(fit.one.exp), col = 'red', lty=2, lwd=2)
应该是
lines(exp.decay$time, predict(fit.one.exp), col = 'red', lty=2, lwd=2)
这样,您可以确保在横坐标上绘制所需的值。
我是这样测试的:
data = read.csv('exp_fit_r.csv')
A0 <- max(data$count)
k0 <- 0.1
fit <- nls(data$count ~ A*exp(-k*data$time), start=list(A=A0, k=k0), data=data)
plot(data)
lines(data$time, predict(fit), col='red')
这给了我以下输出:
如您所见,拟合很好地描述了实际数据,它只是根据正确的横坐标值绘制的问题。
【讨论】:
以上是关于使用 nls 函数错误拟合的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 ggplot2 的 geom_smooth() 显示原始和拟合数据(nls + dnorm)
R nls2 函数 - 结果 [[which.min(ss)]] 中的错误:尝试在 get1index 中选择少于一个元素