2016-05-23 40 views
0

我已经通过了许多问题,但是我无法在相关答案中找到解决问题的方法。我有一个表像这样的存储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上读到的“长度不同”错误的问题实际上在xy中有不同的长度。但是,我的xy(这里是aop)具有完全相同数量的值。

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

After changing the call to nls

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

排序后的AO值

After sorting the AO values

+0

将您的模型调用修改为'expmodel = nls(formula = P_exp(beta * AO),data = df,start = list(beta = 0.01))'。你误解了如何指定'nls'的公式。您也可以考虑创建一个自启动模型(在Google搜索'SSexp')。 – Roland

+0

谢谢,我做了你所说的,并删除了“线条不同”的错误,但最终的情节是一条巨大的直线 - 不是指数曲线。如果可以的话,我会再看看SSexp,但是你知道如何解决这个新问题吗? – Kajal

+0

您需要订购该图的y和x值,以便x值增加。 – Roland

回答

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)。你应该考虑添加一个拦截。

+0

我的实际数据集要大得多,所以我改变了代码的第一部分来引用我的实际表格。其余的依然如此。然而,我没有看到任何线条生成的情节 - 这很奇怪,我会尝试使其颜色不同,看看会发生什么。 – Kajal

+0

我通过在曲线中添加'col =“red”'将其更改为红色,但仍然没有可见的行。我不知道这里出了什么问题。我只更改了数据集 – Kajal

+0

您是否调整过“从”和“到”值? – Roland

相关问题