【问题标题】:How to properly use runif and rnorm to make an equation for a variable?如何正确使用 runif 和 rnorm 为变量制作方程?
【发布时间】:2019-12-27 02:29:24
【问题描述】:

如何正确使用 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 形成的。

感谢您的改进和回复。

【问题讨论】:

  • 你在问这段代码是如何工作的吗?
  • 是的@mcz。对不起,如果我对这个问题的观点不是那么清楚。

标签: r variables equation


【解决方案1】:

我们可以将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 的每个值,在这种情况下,它是一个包含从 0 到 50 的 51 个元素的向量,然后依次放入进入exp 指数函数。这是生成图的一般指数衰减形状的部分。

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

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

【讨论】:

  • 对于如何使用 runif 和 rnorm 为变量制作方程有任何限制吗?
  • 我不明白你的问题。您是在问生成样本数据的方程中加入了哪些参数?你能解释一下你在找什么吗?
  • 是的。另外,我很好奇当我绘制它们时 runif 和 rnorm 如何影响变量 x 和 y。我曾经改变平均值和标准差,然后分析图,但我仍然不明白 runif 和 rnorm 在数学上是如何工作的。谢谢。
  • x 在这种情况下只是从 0 到 50 的 51 个整数。runifrnorm 是给你伪随机数的函数。键入 ?runif?rnorm 以获得这些的帮助文档。通过仔细阅读,这些回答了许多问题。
【解决方案2】:

虽然已经有一个公认的答案,但该问题还询问非线性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)

【讨论】:

  • 我忘记了我还询问了 nls 是否适合,因为我专注于 runif 和 rnorm。此外,您还提供了公式的转换。感谢您的回复。这将是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 2016-10-22
  • 2016-05-23
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多