手动预测功率曲线中的数据

时间:2017-06-22 21:29:04

标签: r curve-fitting prediction non-linear-regression

我有一系列适合功率曲线的数据,我使用R中的预测函数来允许我根据额外的x值预测y值。

set.seed(1485)
len <- 24
x <- runif(len)
y <- x^3 + rnorm(len, 0, 0.06)
ds <- data.frame(x = x, y = y)


mydata=data.frame(x,y)
z <- nls(y ~ a * x^b, data = mydata, start = list(a=1, b=1))
#z is same as M!

power <- round(summary(z)$coefficients[1], 3)
power.se <- round(summary(z)$coefficients[2], 3)
plot(y ~ x, main = "Fitted power model", sub = "Blue: fit; green: known")
s <- seq(0, 1, length = 100)
lines(s, s^3, lty = 2, col = "green")
lines(s, predict(z, list(x = s)), lty = 1, col = "blue")
text(0, 0.5, paste("y =x^ (", power, " +/- ", power.se,")", sep = ""), pos = 4)

如何在此处使用预测函数,而不是基于此幂函数基于附加x值手动计算估计的y值。如果这只是一个简单的线性回归,我会计算斜率和y截距,并按

计算我的y值
y= mx + b

我可以从z的输出中使用类似的公式,这将允许我从其他x值估计y值吗?

> z
Nonlinear regression model
  model: y ~ a * x^b
   data: mydata
    a     b 
1.026 3.201 
 residual sum-of-squares: 0.07525

Number of iterations to convergence: 5 
Achieved convergence tolerance: 5.162e-06

2 个答案:

答案 0 :(得分:1)

除非使用您建模的幂方程式,否则您将以相同的方式执行此操作。您可以使用z$m$getPars()

访问模型计算的参数

这是一个简单的例子来说明:

predict(z, list(x = 1))

结果:1​​.026125

等于

的结果
z$m$getPars()["a"] * 1 ^ z$m$getPars()["b"]

这相当于y = a * x ^ b

答案 1 :(得分:0)

以下是一些方法。

1)with 这将根据系数评估公式:

x <- 1:2 # input

with(as.list(coef(z)), a * x^b)
## [1] 1.026125 9.437504

2)附加我们也可以使用attach,但通常不赞成:

attach(as.list(coef(z)))
a * x^b
## [1] 1.026125 9.437504

3)显式明确定义:

a <- coef(z)[["a"]]; b <- coef(z)[["b"]]
a * x^b
## [1] 1.026125 9.437504

4)eval 这个从z中提取公式,以便我们不必再次指定它。 formula(z)[[3]]是用于生成z的公式的右侧。 eval的使用有时不受欢迎,但这确实避免了 公式的冗余规范。

eval(formula(z)[[3]], as.list(coef(z)))
## [1] 1.026125 9.437504