如何正确使用 runif 和 rnorm 为变量创建方程式?

How to properly use runif and rnorm to make an equation for a variable?

如何正确使用 runif 和 rnorm 来拟合具有起始值的 nls 模型?

这是一个示例代码:

set.seed(5000)
x<-seq(0,50,1)
y<-runif(1,5,15)*exp(-runif(1,0.01,0.05)*x)+rnorm(51,0,0.5)
plot(x,y)

我不知道方程是如何在变量 'y' 上使用 runif 和 rnorm 形成的。

感谢您的改进和回复。

我们可以将y公式拆分为四个部分:

1) runif(1,5,15)515 的均匀分布中选择一个 (1) 数字。这个数字乘以下面#3 的所有 51 个输出元素,因此它驱动曲线的一般高度。

2) runif(1,0.01,0.05)0.010.05 的均匀分布中选择一个 (1) 数字。这个数字乘以 x 并放入#3 中的指数函数,因此它驱动曲线的下降率。

3) #2 被放在一个更大的项中,它将来自 #2 的单个数字乘以 x 的每个值,在本例中是一个包含 51 个元素的向量,从 0 到 50,依次被放入 exp 指数函数中。这是生成图的一般指数衰减形状的部分。

4) 最后一个 +rnorm(51,0,0.5) 通过创建一个包含 51 个元素的向量来散布一些正态分布的噪声,每个元素都来自均值为 0 且 SD 为 0.5 的分布。

所以这个方程模拟了一个有 51 个元素的指数衰减。第一项决定高度,第二项决定斜率,第四项增加一些噪音。

虽然已经有一个可接受的答案,但该问题还询问了非线性 nls 拟合。

这里有一个方法。

df1 <- data.frame(x, y)

cat("a.true:", a, " b.true:", b, "\n")
#a.true: 9.482203  b.true: 0.02768012

nls(y ~ a*exp(-b*x), df1, start = list(a = 5, b = 1))
#Nonlinear regression model
#  model: y ~ a * exp(-b * x)
#   data: df1
#      a       b 
#9.28448 0.02636 
# residual sum-of-squares: 9.493
#
#Number of iterations to convergence: 8 
#Achieved convergence tolerance: 9.938e-08

由于公式不是很复杂,可以转化为x中的线性公式,如log(y) = log(a) - b*x,标准线性模型可以给出参数的其他估计ab。请注意,估计为负 b

fit2 <- lm(log(y) ~ x, df1)
log.a <- coef(fit2)[1]
neg.b <- coef(fit2)[2]
cat("a.lm:", exp(log.a), " b.lm:", -neg.b, "\n")
#a.lm: 9.293966  b.lm: 0.0266301

数据.

重复数据创建代码,这次使用两个参数 ab 显式创建。

set.seed(5000)
x <- seq(0, 50, 1)
a <- runif(1, 5, 15)
b <- runif(1, 0.01, 0.05)
y <- a*exp(-b*x) + rnorm(51, 0, 0.5)