Как мне моделировать две переменные в R, которые нелинейно связаны?
Некоторое время я скрывался в 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 ответа
Быстрый способ - создать нелинейную переменную, а затем добавить к ней некоторый шум:
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)
https://s tackru.com/images/cb26b95a28136d6d56294515a720fd92b4544aee.png
Если какая-то функция не ясна, пожалуйста, дайте мне знать.
PS: не нужно извиняться. Если бы никто никогда не задавал новичкам вопросы, в мире не было бы экспертов.
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])
https://s tackru.com/images/c52c92fdd97e063c3d089b1c6671d85a1e3b0efa.png