Fiting 1 - exp(x)给予第一个值更高的权重

时间:2016-07-19 09:24:34

标签: r nls

我希望将1 - exp(x)函数适用于数据集,但是对第一个值赋予更高的权重。但是,以下代码不能以这种方式工作:

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)))

这是输出:

1 个答案:

答案 0 :(得分:0)

您的重量规格是正确的。您获得的不合适是由于您的错误模型假设。你假设:

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

请注意,exp()会给出严格的正值,因此y不会大于1.但是,数据中的y值最多可达35个。

我的想法并不完美,但它可能会给你一个更好的起点。考虑:

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