我想为 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)
并添加一条等温线对应于您的起始参数 Q
和 b
以及调整 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')
话虽如此,我建议使用一种更有效的策略,基于模型的线性化,通过在倒数坐标中重写等温线方程:
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/