我在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上读到的另一个问题是,&#39;长度不同&#39;错误实际上在x
和y
中有不同的长度。不过,我的x
和y
(此处ao
和p
)的值数字完全相同。
请注意,指数曲线实际上不太适合,但我正在尝试几种不同的模型,我想知道如何正确使用nls
所以我也可以这样做其他型号。
一些相关的曲线拟合问题:
This question说起始数据是关键。我表中AO的最小值是0.015,我选择0.01,这在我看来足够接近。 This question询问nls,并使用lm使用多项式给出答案。我特别需要知道将来如何将nls用于很多复杂的模型,这对我来说不起作用。 This question看起来很有希望,但我无法通过查看问题和答案在代码中找到问题 - 我的代码中也有类似的陈述。
我该怎么做?
修改
以下是Roland评论中发布的解决方案的屏幕截图:(实际数据集更大)
将对nls的调用更改为expmodel = nls(formula = p ~ exp(beta * ao), data = df, start = list(beta = 0.01))
使用lines(sort(ao), predict(expmodel))
答案 0 :(得分:1)
df <- read.table(text = "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", header = TRUE)
#use correct syntax:
expmodel = nls(formula = P ~ exp(beta * AO), data = df, start = list(beta = 0.01))
plot(P ~ AO, data = df)
#you could use lines after sorting, but this is more convenient:
curve(predict(expmodel, newdata = data.frame(AO = x)), from = 49, to = 120, add = TRUE)
显然,这不是一个很好的数据模型。如你所知,指数函数通过(0,1)。您应该考虑添加拦截。