r - 在 R 中拟合非线性朗缪尔等温线

标签 r nonlinear-functions nls non-linear-regression

我想为 R 中的以下数据拟合等温线模型。最简单的等温线模型是此处给出的 Langmuir 模型 model is given in the bottom of the page .下面给出了我的 MWE,它抛出了错误。我想知道是否有用于等温模型的 R 包。

X <- c(10, 30, 50, 70, 100, 125)
Y <- c(155, 250, 270, 330, 320, 323)
Data <- data.frame(X, Y)
LangIMfm2 <- nls(formula = Y ~ Q*b*X/(1+b*X),  data = Data, start = list(Q = 1, b = 0.5), algorith = "port")

Error in nls(formula = Y ~ Q * b * X/(1 + b * X), data = Data, start = list(Q = 1,  : 
  Convergence failure: singular convergence (7)

已编辑

一些非线性模型可以转化为线性模型。我的理解是非线性模型的估计与其线性模型形式之间可能存在一对一的关系,但它们对应的标准误差彼此无关。这个说法是真的吗?通过转换为线性来拟合非线性模型是否有任何陷阱?

最佳答案

我不知道有这样的包,我个人认为你不需要一个,因为这个问题可以使用基本 R 来解决。

nls 对起始参数很敏感,因此您应该从一个好的起始猜测开始。您可以轻松计算 Q,因为它对应于 x-->Inf 处等温线的渐近极限,因此从 Q=323 开始是合理的(这是示例数据集中 Y 的最后一个值)。

接下来,您可以执行 plot(Data) 并添加一条等温线对应于您的起始参数 Qb 以及调整 b 以得出合理的猜测。

下图显示了您的数据集(点)和 Q = 323 和 b = 0.5 的探针等温线,由 with(Data,lines(X,323*0.5*X/(1+0.5* X),col='red'))(红线)。对我来说,这似乎是一个合理的开始猜测,我用 nls 试了一下:

LangIMfm2 <- nls(formula = Y ~ Q*b*X/(1+b*X),  data = Data, start = list(Q = 300, b = 1), algorith = "port")
# Nonlinear regression model
#   model: Y ~ Q * b * X/(1 + b * X)
#    data: Data
#        Q        b 
# 366.2778   0.0721 
#  residual sum-of-squares: 920.6
# 
# Algorithm "port", convergence message: relative convergence (4)

并绘制预测线以确保 nls 找到正确的解决方案:

lines(Data$X,predict(LangIMfm2),col='green')

enter image description here

话虽如此,我建议使用一种更有效的策略,基于模型的线性化,通过在倒数坐标中重写等温线方程:

enter image description here

z <- 1/Data
plot(Y~X,z)
abline(lm(Y~X,z))
M <- lm(Y~X,z)

Q <- 1/coef(M)[1]
# 363.2488 

b <- coef(M)[1]/coef(M)[2]
# 0.0741759 

如您所见,这两种方法产生的结果基本相同,但线性模型更稳健并且不需要起始参数(据我所知,这是等温线分析的标准方法实验物理化学)。

关于r - 在 R 中拟合非线性朗缪尔等温线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903247/

相关文章:

r - PROC NLIN 从 SAS 到 R

r - 如何计算两个极值之间的值个数?

r - ggplot2警告:ymin!= 0时,堆栈定义不正确

list - R中的字典数据结构

r - 从R中的数字中提取第一个非零数字

sas - SAS 中的非线性多元回归

r - 是否可以从模型中调用 nls 参数?

R:在 nls 中使用带有自然对数的方程

python - 如何使用Python解决风险平价分配

r - 如何为 nls 函数找到好的起始值?