使用带有R

时间:2016-05-23 11:01:58

标签: r nls

我在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;错误实际上在xy中有不同的长度。不过,我的xy(此处aop)的值数字完全相同。

请注意,指数曲线实际上不太适合,但我正在尝试几种不同的模型,我想知道如何正确使用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))

After changing the call to nls

使用lines(sort(ao), predict(expmodel))

对AO值进行排序后

After sorting the AO values

1 个答案:

答案 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)

resulting plot

显然,这不是一个很好的数据模型。如你所知,指数函数通过(0,1)。您应该考虑添加拦截。