2017-02-28 8 views
1

私は、フィッティングnlsを助け、特異行列にならない初期推定値を見つける必要があります。私はどんな助けにも大いに感謝します。 st以下NLS Curve Fit特異行列エラー

via_data$Concentration <- c(0.197, 0.398, 0.792, 1.575, 
          3.154, 6.270, 12.625, 25.277, 
          25.110, 49.945, 74.680) 
via_data$Viability <- c(100, 94.62, 96.21, 87.53, 
         80, 62.22, 39.11, 
         30.80, 30, 22, 2.56) 
x <- via_data$Concentration 
y <- via_data$Viability 
fit <- nls(y ~((1/(1+Epsup/x)^Bup)*(1/(1+Epsdn/x)^Bdn)), start=list(Epsup=0, Bup=1, Epsdn=10, Bdn=-5), trace=T) 

Error in nlsModel(formula, mf, start, wts) : 
    singular gradient matrix at initial parameter estimates 

おかげで、 Krina

+0

あなたの数式は 'y〜1 /(1 + Epsup/x)^(Bup + Bdn)'と同じです。そのため、 'Bup + Bdn'しか推定できません。また同じです: 'y〜(1 + Epsup/x)^( - Bup-Bdn)' – jogo

+0

Thsはhttp://stackoverflow.com/questions/34201377/r-and-nls-singular-gradientと同じ問題ではありません-matrix-at-initial-parameter。その問題では、問題は過大パラメータでした。この問題は、一般的に、 'Epsup = Epsdn'またはパラメータのいずれかが0に近い場合にのみオーバーパラメタ化されるわけではなく、' 1 + Epsup/x'と '1 + Epsdn/x 'は正のままである。したがって、そのような悪い領域から離れないように十分に良い値を見つけることができれば、解決することができます。 –

答えて

2

我々は0 foで縮退を回避するためにEpsup=1を使用したこと以外は、ご出発値である式です。負の数をべき乗にするのを防ぐために、Epsupsqrt(Epsup^2)に置き換え、同様にEpsdnと置き換えました。これにより、EpsupEspdnは負ではないという前提が追加されます。 (これはabs(Epsup)を使用するのと同じですが、nlxbの派生テーブルにはabsがありません)。nls2を使用して、境界線st/1010*stの間のグリッドに値を生成します。 nls2はこれらを生成し、見つかった最良のものを"nls"オブジェクトに返します。これをnlmrtパッケージのnlxbの開始値として使用します。それはnlsよりも良い問題を処理します。 nlxbは、(パッケージがnls続いnlxbを実行しますが、その後、我々はnlxbから直接出力を得ることはありませんwrapnlsを持っているが)"nls"オブジェクトを返すので、私たちはfittedを使用することができ"nls"オブジェクトを作成するために、再びnls2を通じてそのを供給していません方法。結果のフィットをプロットします。

次を与える
library(nlmrt) 
library(nls2) 

st <- c(Epsup=1, Bup=1, Epsdn=10, Bdn=-5) 
fo <- y ~ (1/(1+sqrt(Epsup^2)/x)^Bup)*(1/(1+sqrt(Epsdn^2)/x)^Bdn) 

fit.nls2 <- nls2(fo, start = data.frame(rbind(st/10, 10*st)), alg = "brute") 
fit.nlxb <- nlxb(fo, data = data.frame(x, y), start = coef(fit.nls2)) 

> fit.nlxb 
nlmrt class object: x 
residual sumsquares = 171.2 on 11 observations 
    after 19 Jacobian and 25 function evaluations 
    name   coeff   SE  tstat  pval  gradient JSingval 
Epsup   10.7464   10.95  0.9814  0.3591 6.855e-05  1584 
Bup    1.15049  0.5928  1.941 0.09345 0.001839  120.2 
Epsdn   642.754   908.5  0.7075  0.5021 -1.298e-06  1.406 
Bdn    -1.13885  0.6315  -1.804  0.1143 0.004964 0.005443 

と視覚的に適合性を評価するためにプロットする:

fit.nlxb.nls <- nls2(fo, start = coef(fit.nlxb)) 
plot(y ~ x) 
lines(fitted(fit.nlxb.nls) ~ x) 

screenshot

注:私たちは、この入力を使用:

を0
via_data <- data.frame(Concentration = c(0.197, 0.398, 0.792, 1.575, 
    3.154, 6.270, 12.625, 25.277, 25.110, 49.945, 74.680), 
Viability = c(100, 94.62, 96.21, 87.53, 80, 62.22, 39.11, 
         30.80, 30, 22, 2.56)) 
x <- via_data$Concentration 
y <- via_data$Viability 
+0

非常に役に立ちます。ありがとう –