【发布时间】:2016-09-20 05:32:12
【问题描述】:
我已经解决了很多关于 SO 的问题,但我无法在相关答案中找到解决问题的方法。我有一个这样的表存储为PAO1.data:
Name P AO
Prog1 0.654 59.702
Prog2 0.149 49.595
Prog3 0.505 50.538
Prog4 0.777 59.954
Prog5 0.237 49.611
Prog6 0.756 50.630
Prog7 0.560 118.014
Prog8 0.015 53.779
Prog9 0.789 68.096
Prog10 0.825 79.558
我尝试使用 nls 来拟合数据的指数曲线。
df = data.frame(PAO1.data)
p = df$P
ao = df$AO
RMSE <- function(fit, act){
sqrt(mean((fit - act)^2))
}
expmodel = nls(formula = p ~ exp(ao), data = df, start = list(ao = 0.01))
fit1 = fitted.values(expmodel)
err1 = RMSE(fit1, p)
plot(ao, p)
lines(ao, predict(expmodel))
print(err1)
当我尝试运行它时,我在创建 expmodel 时收到这些警告消息:
Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
同时,我在lines() 收到此错误:
Error in xy.coords(x, y) : 'x' and 'y' lengths differ
Calls: lines -> lines.default -> plot.xy -> xy.coords
我在 SO 上阅读的另一个问题,“长度不同”错误实际上在 x 和 y 中的长度不同。但是,我的 x 和 y(这里是 ao 和 p)具有完全相同数量的值。
请注意,指数曲线实际上不太适合,但我正在尝试几种不同的模型,我想知道如何正确使用nls,以便我可以对其他模型做同样的事情.
一些相关的曲线拟合问题:
This question 表示起始数据是关键。我表中 AO 的最小值是 0.015,我选择了 0.01,在我看来已经足够接近了。 This question 询问有关 nls 的问题,并使用使用 lm 的多项式给出答案。我特别需要知道将来如何将 nls 用于许多复杂的模型,这对我不起作用。 This question 看起来很有希望,但我无法通过查看该问题和答案在我的代码中找到问题 - 我的代码中也有类似的语句。
我该怎么做?
编辑:
以下是Roland在cmet中发布的解决方案截图:(实际数据集更大)
将nls的调用改为expmodel = nls(formula = p ~ exp(beta * ao), data = df, start = list(beta = 0.01))后
用lines(sort(ao), predict(expmodel))对AO值排序后
【问题讨论】:
-
将您的模型调用修复为
expmodel = nls(formula = P ~ exp(beta * AO), data = df, start = list(beta = 0.01))。您误解了如何指定nls的公式。您还可以考虑创建一个自启动模型(在 Google 上搜索SSexp)。 -
谢谢,我按照你说的做了,它消除了“线条不同”的错误,但结果图是一大堆直线 - 而不是指数曲线。如果可以的话,我稍后会查看
SSexp,但是你知道如何解决这个新问题吗? -
您需要对绘图的 y 和 x 值进行排序,以便 x 值增加。
-
另一个答案也说使用
sort删除混乱的行,但它仍然以不同的方式混乱。我会上传截图。 -
我已经上传了截图。你能看一下吗?