2017-04-10 11 views
1

"nlmrtオブジェクトを"nls"オブジェクトに変換しようとしています。nls2を使用しています。しかし、私は明示的にコールのパラメータの名前を書く場合にのみそれを行うことができます。パラメータ名をプログラムで定義することはできませんか?再現性の例を参照してください:nlmrtオブジェクトをnlsオブジェクトに変換しようとすると、ここで間違っています。

library(nlmrt) 

scale_vector <- function(vector, ranges_in, ranges_out){ 
    t <- (vector - ranges_in[1, ])/(ranges_in[2, ]-ranges_in[1, ]) 
    vector <- (1-t) * ranges_out[1, ] + t * ranges_out[2, ] 
} 

shobbs.res <- function(x) { 
    # UNSCALED Hobbs weeds problen -- coefficients are rescaled internally using 
    # scale_vector 

    ranges_in <- rbind(c(0, 0, 0), c(100, 10, 0.1)) 
    ranges_out <- rbind(c(0, 0, 0), c(1, 1, 1)) 
    x <- scale_vector(x, ranges_in, ranges_out) 

    tt <- 1:12 
    res <- 100*x[1]/(1+10*x[2]*exp(-0.1*x[3]*tt)) - y } 


y <- c(5.308, 7.24, 9.638, 12.866, 17.069, 23.192, 31.443, 
     38.558, 50.156, 62.948, 75.995, 91.972) 
st <- c(b1=100, b2=10, b3=0.1) 

ans1n <- nlfb(st, shobbs.res) 
print(coef(ans1n)) 

これは動作します:

library(nls2) 
ans_nls2 <- nls2(y ~ shobbs.res(c(b1, b2, b3)) + y, start = coef(ans1n), alg = "brute") 

しかし、これはnls2への呼び出しでハードコードのパラメータ名に私を強制します。私の実際のコードに関連する理由のために、私は

ans_nls2 <- nls2(y ~ shobbs.res(names(st)) + y, start = coef(ans1n), alg = "brute") 

ような何かをできるようにしたいと思います。しかし、これはエラーを返します:

Error in vector - ranges_in[1, ] : 
    non-numeric argument to binary operator 

は、それがハードすることなく、この問題を解決することは可能ですnls2への呼び出しのパラメータの名前を明示的にコード化しますか?

答えて

1

nls2は、式などの文字列を受け付けます:

co <- coef(ans1n) 
fo_str <- sprintf("y ~ shobbs.res(c(%s)) + y", toString(names(co))) 

nls2(fo_str, start = co, alg = "brute") 

は与える:

Nonlinear regression model 
    model: y ~ shobbs.res(c(b1, b2, b3)) + y 
    data: NULL 
     b1  b2  b3 
196.1863 49.0916 0.3136 
residual sum-of-squares: 2.587 

Number of iterations to convergence: 3 
Achieved convergence tolerance: NA 
+0

素晴らしい:)をそんなにR' 'における非線形回帰で私を助けてくれてありがとう、あなたは最高です! – DeltaIV

関連する問題