2016-07-19 4 views
0

データセットに1 - exp(x)関数を適合させたいが、最初の値に大きな重みを付ける。しかし、次のコードは、このような方法で動作していない。ここで 最初の値に大きな重みを付ける1 - exp(x)を適合させる:R

x <-sqrt((0.05)^2+(0.05)^2)*seq(from = 1, to = 20, by = 1) 
y <- c(11,20,27,32,35,36,36.5,25,16,9,4,1,7.87e-16,2.07e-15,-9.36e-16,1.61e-15,-3.81e-16,3.92e-16,7.65e-16,-8.26e-16) 
temp <- data.frame(cbind(x,y)) 
we <- 1/(log1p(seq_along(x))) 
# fit non-linear model 
mod <- nls(y ~ (1 - exp(a + b * x)), data = temp, start = list(a = 0, b = 0), weights = we) 

#add fitted curve 
lines(temp$x, predict(mod, list(x = temp$x))) 

が出力されます。重みの

enter image description here

+0

おかげで、私のデータが既に掲載されています。 – mountainlake

答えて

0

あなたの仕様が正しいです。あなたが得た悪い適合はあなたの間違ったモデル仮定のためです。 yが1より大きくはしかし、あなたのデータでy値は35

までの範囲にされませんexp()は厳密に正の値を与えること

y ~ 1 - exp(a + b * x) 

注ので、私の考えは完全ではありませんが、:あなたは仮定しましたそれはあなたに良い出発点を与えるかもしれません。考えてみましょう:

y ~ a * x * exp(b * x * x + c * x) 

あなたのデータを使用して:

x <- c(0, sqrt((0.05)^2+(0.05)^2)*seq(from = 1, to = 20, by = 1)) 
y <- c(0, 11,20,27,32,35,36,36.5,25,16,9,4,1,7.87e-16,2.07e-15,-9.36e-16,1.61e-15,-3.81e-16,3.92e-16,7.65e-16,-8.26e-16) 
fit <- nls(y ~ a * x * exp(b * x * x + c * x), start = list(a = 30, b= -1, c = -1)) 
plot(x, y) 
lines(x, predict(fit, list(x))) 

enter image description here

+0

多くのおかげでZheyuan!ウェイトを使って最初の6ポイントに合わせたい場合はどうすればいいですか?どの機能をお勧めしますか? – mountainlake

+0

どの機能を使用していますか? y - a *(1 - exp(b * x))? – mountainlake

関連する問題