【问题标题】:How do I simulate two variables in R which are non-linearly related?如何模拟 R 中非线性相关的两个变量?
【发布时间】:2019-05-27 03:02:22
【问题描述】:

我已经在 SO 上潜伏了一段时间,但最后有个问题,我在这个网站或其他任何地方都找不到答案。所以创建了帐户,然后就可以了。如果这个问题确实在其他地方得到了回答,我们深表歉意。那我的搜索能力需要提高!

在 R 中,我想生成两个非线性相关的变量。

我已经弄清楚如何使用 MASS 库中的 mvrnorm 函数来模拟两个变量之间的线性关联,如下所示,但现在想模拟两个遵循非线性关联的变量。

library ('MASS')

data = mvrnorm(n=100, mu=c(170, 80), Sigma=matrix(c(1, 0.85, 0.85, 1),   nrow=2), empirical=TRUE)
height = data[, 1]  # standard normal (mu=170, sd=1)
weight = data[, 2]  # standard normal (mu=80, sd=1)

我并不特别介意它是哪种非线性关联(例如指数、对数等)。我只是想生成一些散点图来展示线性关联和非线性关联之间的区别。

我既不是统计数据也不是 R 专家,因此非常感谢看似过于简单的答案!

非常感谢您提供的任何帮助。

【问题讨论】:

  • 感谢您的回复。但是,我认为这模拟了两个没有关联的变量(即 r = 0),而不是非线性关联(例如对数关联或指数关联。
  • 感谢 IceCreamToucan 的快速回复。这会创建两个完全关联的变量。但是,我如何在数据中产生噪音,就像我给出的示例一样,其中 r 为 0.85(例如在人类参与者中进行测量时可能会发现)?

标签: r simulation nonlinear-functions


【解决方案1】:

一种快速的方法是创建一个非线性变量,然后对其添加一些噪声:

x = seq(-100, 100)    # just a sequence of numbers
y = x^2 + rnorm(length(x), 0, 1000)      # generate non-linear association + noise
plot(x, y)

如果有些功能不清楚,请告诉我。

PS:不用道歉。如果没有人问过菜鸟问题,那么世界上就没有专家。

【讨论】:

  • 感谢李沃!这将有助于我展示非线性的目的。你的回答让我意识到,虽然我应该更仔细地表达我的问题。在您的解决方案中,我认为每个 x 值(例如身高)只有一个 y 值(例如体重)?在人类参与者的样本中,我可能有几个身高相同的人(即 x 值)。如果我想模拟它,使用 runif 而不是 seq 会更好吗?
  • 不客气。有很多方法可以用相同的 x 添加多个观察值。例如您可以在现有的分布中添加额外的 y 分布。 x = seq(-200, 200) # just a sequence of numbers y1 = x^2 + rnorm(length(x), 0, 1000) # generate non-linear associations + noise y2 = x^2 + rnorm(length(x), 0, 3000) y3 = x^2 + rnorm(length(x), 0, 6000) plot(x, y1) points(x, y2) # adds other points to the last plot points(x, y3) 有人可能会说这不是最优雅的解决方案,但它绝对是快速且易于阅读的。
【解决方案2】:

mvrnorm::MASS 不允许您对该维度中的均值进行矢量化,但您可以通过向均值添加适当的偏移量来实现。

set.seed(101)
dd <- MASS::mvrnorm(n=100, 
     mu=c(0,0), Sigma=0.001*matrix(c(1, 0.85, 0.85, 1),   nrow=2),
         empirical=TRUE)
xvec <- seq(0,2,length=100)
dd[,1] <- dd[,1] + exp(-3*xvec)
dd[,2] <- dd[,2] + xvec
plot(dd[,1],dd[,2])

【讨论】:

  • 谢谢本!这确实产生了图表,但恐怕我不理解所有的代码。为什么将协方差矩阵乘以 0.001? (我不得不承认我不太明白 mvrnorm 是如何工作的,尽管阅读了它)。
  • 我使方差更小,因此可以看到非线性模式。
猜你喜欢
  • 2016-04-22
  • 1970-01-01
  • 2017-08-20
  • 2019-05-04
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多