Как мне моделировать две переменные в R, которые нелинейно связаны? - PullRequest
0 голосов
/ 29 декабря 2018

Я некоторое время скрывался о SO, но, наконец, у меня возник вопрос, на который я не смог найти ответ ни на этом сайте, ни где-либо еще.Итак, аккаунт создан, и здесь идет.Извинения, если этот вопрос действительно был дан ответ в другом месте.Мои навыки поиска нуждаются в улучшении!

В R я хотел бы сгенерировать две переменные, которые нелинейно связаны.

Я выяснил, как использовать функцию mvrnorm в библиотекеMASS для имитации линейной ассоциации между двумя переменными, как показано ниже, но теперь хотелось бы смоделировать две переменные, которые следуют нелинейной ассоциации.

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, поэтому, казалось бы, чрезмерно упрощенные ответы были бы очень благодарны!

Большое спасибо за любую помощь, которую вы можете оказать.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

быстрый способ - создать нелинейную переменную, а затем добавить к ней некоторый шум:

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)

enter image description here

Если какая-то функцияне ясно, пожалуйста, дайте мне знать.

PS: Не нужно извиняться.Если бы никто никогда не задавал новичкам вопросы, в мире не было бы экспертов.

0 голосов
/ 29 декабря 2018

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])

enter image description here

...