【问题标题】:Fit an exponential curve using nls with a custom data frame in R使用 nls 与 R 中的自定义数据框拟合指数曲线
【发布时间】: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 上阅读的另一个问题,“长度不同”错误实际上在 xy 中的长度不同。但是,我的 xy(这里是 aop)具有完全相同数量的值。

请注意,指数曲线实际上不太适合,但我正在尝试几种不同的模型,我想知道如何正确使用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 删除混乱的行,但它仍然以不同的方式混乱。我会上传截图。
  • 我已经上传了截图。你能看一下吗?

标签: r nls


【解决方案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)。您应该考虑添加拦截。

【讨论】:

  • 我的实际数据集要大得多,所以我更改了代码的第一部分以引用我的实际表。其余的保持不变。但是我在生成的绘图上看不到任何线条 - 这很奇怪,我会尝试使其颜色不同并看看会发生什么。
  • 我通过在曲线中添加col="red" 将其更改为红色,但仍然看不到线。我不知道这里出了什么问题。我只更改了数据集
  • 您是否调整了fromto 的值?
  • 哦,谢谢,我没有 - from 保持不变,但 to 的限制应该是 155。但仍然没有行。
  • y轴刻度可能有问题?省略add = TRUE 以仅查看曲线并相应地在plot 中设置ylim
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2011-01-15
  • 1970-01-01
  • 2015-10-29
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多