2

この投稿で行われたのと同様nlsのラングミュア方程式のフィッティングを支援するために使用することに興味がありますR の非線形ラングミュア等温線のフィッティング. 私が興味を持っている方程式のパラメーターは、以下にプロットされた収着データの水平方向の漸近線 (緑の線) に対応するものです。周囲の視覚的な漸近線 (緑の線) にできるだけ近い値を取得するために使用できる方法以外に、より堅牢なアプローチ、または使用を改善する方法はありますか?Y =(Qmax*k*X)/(1+(k*X))QmaxnlsnlsQmaxQmax=3200

Lang <- nls(formula = Y ~ (Qmax*k*X)/(1+(k*X)),  data = data, start = list(Qmax = 3600, k = 0.015), algorith = "port") 

次のデータを使用します。

     X        Y
1    3.08   84.735
2    5.13  182.832
3    6.67  251.579
4    9.75  460.077
5   16.30  779.350
6   25.10  996.540
7   40.80 1314.739
8   68.90 1929.422
9  111.00 2407.668
10 171.00 3105.850
11 245.00 3129.240
12 300.00 3235.000

私はQmax = 4253.63(赤線)を得ています - 約1000ユニット離れています。上限と下限を使用しても、上限に設定した Qmax のみが得られ、初期値を変更しても結果は変わらないようです。これは、ベース R で採用したものとは異なる非線形回帰へのアプローチで解決できる課題ですか、それとも何よりもまず統計的/数学的な問題ですか?

非線形ラングミュア等温線のプロット

 summary(Lang)

    Formula: Y ~ (Qmax * k * X)/(1 + (k * X))

Parameters:
      Estimate Std. Error t value Pr(>|t|)    
Qmax 4.254e+03  1.554e+02   27.37 9.80e-11 ***
k    1.209e-02  1.148e-03   10.53 9.87e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 99.14 on 10 degrees of freedom

Algorithm "port", convergence message: relative convergence (4)

モデルの線形化の試みはうまくいきませんでした:

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

Qmax <- 1/coef(M)[1]
#4319.22

k <- coef(M)[1]/coef(M)[2]
#0.00695

免責事項:これは私の最初の投稿ですので、ご容赦ください。私はRに比較的慣れていません。上記の技術を改善するのに役立つ可能性のある技術的なアドバイスは大歓迎です。

4

1 に答える 1

2

なぜそんなにQmax低いと予想するのかわからない

私はあなたの依存関係を最も単純な形で書き直し、乗算を削除し、分母と分母の両方kを 結果は私の目には完璧に見えます。

library(ggplot2)
library(data.table)

dt <- fread("R/Langmuir.dat", sep = " ")

Lang <- nls(formula = Y ~ (Qmax*X)/(a+X),  data = dt, start = list(Qmax = 3600, a = 100.0), algorithm = "port")
q <- summary(Lang)

Qmax <- q$coefficients[1,1]
a    <- q$coefficients[2,1]

f <- function(x, Qmax, a) {
    (Qmax*x)/(a+x)
}

p <- ggplot(data = dt, aes(x = X, y = Y))
p <- p + geom_point()
p <- p + xlab("T") + ylab("Q") + ggtitle("Langmuir Fit")
p <- p + stat_function(fun = function(x) f(x, Qmax=Qmax, a=a))
print(p)

print(Qmax)
print(a)

出力

4253.631
82.68501

グラフ

ここに画像の説明を入力

アップデート

基本的に、低い X ではポイントが多すぎて、低い Qmax でカーブを曲げるのが難しくなります。カーブを曲げるために設計された方法は、ウェイトを追加することです。たとえば、データ テーブルを読み取った後に重み列を追加すると、次のようになります。

dt[, W := (as.numeric(N)/12.0)^3]

nls重みをつけて走る

Lang <- nls(formula = Y ~ (Qmax*X)/(a+X),  data = dt, start = list(Qmax = 3600, a = 100.0), weights = dt$W, algorithm = "port")

私は取得Qmaxしますa

[1] 4121.114
[1] 74.89386

次のグラフで

ここに画像の説明を入力

于 2016-05-11T21:06:16.993 に答える