3

R で次のデータの等温線モデルを当てはめたいと思います。最も単純な等温線モデルは、ここで指定されたラングミュア モデルです。モデルはページの下部で指定されています。エラーをスローする私のMWEを以下に示します。Isotherm モデル用の 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)

編集済み

一部の非線形モデルは、線形モデルに変換できます。私の理解では、非線形モデルの推定値とその線形モデル形式の間には 1 対 1 の関係があるかもしれませんが、対応する標準誤差は互いに関連していません。この主張は本当ですか?線形性に変換して非線形モデルをフィッティングする際に落とし穴はありますか?

4

3 に答える 3

3

私はそのようなパッケージを認識していません.個人的には、ベースRを使用して問題を解決できるため、パッケージは必要ないと思います.

nlsは開始パラメータに影響されるため、適切な開始推測から開始する必要があります。Qx-->Inf での等温線の漸近限界に対応するため、簡単に評価できます。そのため、最初から妥当です (これは、サンプル データ セット内Q=323の の最後の値です)。Y

次に、開始パラメーターに対応する等温線を追加し、微調整して合理的な推測を行うことがplot(Data)できます。Qbb

with(Data,lines(X,323*0.5*X/(1+0.5*X),col='red'))以下のプロットは、データ セット (ポイント) と、 (赤い線)によって生成された Q = 323 および b = 0.5 のプローブ等温線を示しています。それは私にとって合理的な出発点のように思えたので、次のように試してみました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 

ご覧のとおり、どちらのアプローチでも本質的に同じ結果が得られますが、線形モデルの方が堅牢であり、開始パラメーターを必要としません (そして、私が覚えている限りでは、実験物理化学における等温線分析の標準的な方法です。 )。

于 2015-03-06T18:47:45.453 に答える
0

問題は開始値です。これに対する 2 つのアプローチと、問題の開始値を使用しても収束する代替案を示します。

1) plinear右辺は Q*b で線形であるため、b を Q に吸収する方がよいでしょう。その後、線形に入るパラメーターがあるため、より簡単に解決できます。また、plinear アルゴリズムでは、線形パラメーターの開始値は必要ないため、b の開始値のみを指定する必要があります。plinear では、nls 式の右辺を、線形パラメーターを乗算するベクトルとして指定する必要があります。以下に示すnls を実行した結果は、fm0名前付きの係数でbあり.lin、Q = .lin / b です。

からの回答は既に得られていますが、 andではなくandfm0に関してクリーンな実行が必要な場合は、示されているように、によって返される係数によって暗示された開始値を使用して、問題の元の式を実行できます。bQb.linfm0

fm0 <- nls(Y ~ X/(1+b*X), Data, start = list(b = 0.5), alg = "plinear")

st <- with(as.list(coef(fm0)), list(b = b, Q = .lin/b))
fm <- nls(Y ~ Q*b*X/(1+b*X), Data, start = st)
fm

与える

Nonlinear regression model
  model: Y ~ Q * b * X/(1 + b * X)
   data: Data
       b        Q 
  0.0721 366.2778 
 residual sum-of-squares: 920.6

Number of iterations to convergence: 0 
Achieved convergence tolerance: 9.611e-07

結果を表示できます。ポイントはデータで、赤い線は適合曲線です。

plot(Data)
lines(fitted(fm) ~ X, Data, col = "red")

(プロットの後に続く) スクリーンショット

2) meanまたは、Q に mean(Data$Y) の開始値を使用するとうまくいくようです。

nls(Y ~ Q*b*X/(1+b*X), Data, start = list(b = 0.5, Q = mean(Data$Y)))

与える:

Nonlinear regression model
  model: Y ~ Q * b * X/(1 + b * X)
   data: Data
       b        Q 
  0.0721 366.2779 
 residual sum-of-squares: 920.6

Number of iterations to convergence: 6 
Achieved convergence tolerance: 5.818e-06

質問には、b使用した合理的な開始値が既にありましたが、必要な場合は、キャンセルして平均 (Data$X) を設定し、可能性のある開始値として与えるために解くことYができます。の開始値として のこの開始値を使用することは示されていませんが、収束も生じました。Q*bXbb = 1 - 1/mean(Data$X)bmean(Data$Y)Q

3) optimアルゴリズム を使用optimすると、質問で使用した初期値でも収束します。残差二乗和を形成し、それを最小化します。

rss <- function(p) {
  Q <- p[1]
  b <- p[2]
  with(Data, sum((Y - b*Q*X/(1+b*X))^2))
}
optim(c(1, 0.5), rss)

与える:

$par
[1] 366.27028219   0.07213613

$value
[1] 920.62

$counts
function gradient 
     249       NA 

$convergence
[1] 0

$message
NULL
于 2020-11-28T16:05:14.113 に答える