如何正确使用 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)
从 5
到 15
的均匀分布中选择一个 (1
) 数字。这个数字乘以下面#3 的所有 51 个输出元素,因此它驱动曲线的一般高度。
2) runif(1,0.01,0.05)
从 0.01
到 0.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
,标准线性模型可以给出参数的其他估计a
和 b
。请注意,估计为负 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
数据.
重复数据创建代码,这次使用两个参数 a
和 b
显式创建。
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)
如何正确使用 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)
从 5
到 15
的均匀分布中选择一个 (1
) 数字。这个数字乘以下面#3 的所有 51 个输出元素,因此它驱动曲线的一般高度。
2) runif(1,0.01,0.05)
从 0.01
到 0.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
,标准线性模型可以给出参数的其他估计a
和 b
。请注意,估计为负 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
数据.
重复数据创建代码,这次使用两个参数 a
和 b
显式创建。
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)