我已经通过了许多问题,但是我无法在相关答案中找到解决问题的方法。我有一个表像这样的存储PAO1.data
:在R中使用带有自定义数据框的nls的指数曲线
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看起来很有希望,但我无法通过查看该问题和答案在代码中找到问题 - 我的代码中也有类似的声明。
我该怎么做?
编辑:
这里是由罗兰在评论中张贴解决方案的截图:(实际数据集越大)
改变调用NLS到expmodel = nls(formula = p ~ exp(beta * ao), data = df, start = list(beta = 0.01))
用lines(sort(ao), predict(expmodel))
将您的模型调用修改为'expmodel = nls(formula = P_exp(beta * AO),data = df,start = list(beta = 0.01))'。你误解了如何指定'nls'的公式。您也可以考虑创建一个自启动模型(在Google搜索'SSexp')。 – Roland
谢谢,我做了你所说的,并删除了“线条不同”的错误,但最终的情节是一条巨大的直线 - 不是指数曲线。如果可以的话,我会再看看SSexp,但是你知道如何解决这个新问题吗? – Kajal
您需要订购该图的y和x值,以便x值增加。 – Roland