Имитация данных (X, Y), квадратично связанных друг с другом - PullRequest
0 голосов
/ 10 июля 2019

Я хочу смоделировать набор данных с двумя переменными (X, Y), где отношение между этими переменными является квадратичным (некоторая версия перевернутой буквы U). Есть ли способ сделать это в R? Понятно, что точная форма взаимосвязи может отличаться, как и уникальный эффект квадратичного члена сверх линейного члена. В идеальном мире симуляция зафиксировала бы общую объясненную дисперсию Y и уникальную дисперсию квадратичного члена в популяции.

Я собираюсь создать что-то вроде этого: 1000 пар XY, где Y имеет нормальное распределение с Mn = 0, SD = 1 и X как близко к нормальному распределению, так и близко к Mn = 0, SD = 1, насколько это возможно. Полная дисперсия объясняется слабым линейным и квадратичным слагаемым (R ^ 2 = .05) [под общей дисперсией я имею в виду, если я регрессирую Y на X и X ^ 2, кратное R ^ 2 = .05]. У меня нет данных для примера, потому что они должны быть смоделированы; вопрос заключается в пограничном перекрестном подтверждении или переполнении стека, но, учитывая желание сделать это в R, кажется, что он подходит лучше всего.

Спасибо за любую помощь.


Посмотрев еще немного, наткнулся на пакет simstudy, который обеспечивает некоторую гибкость в создании симулированных квадратичных отношений:

library(psych)
library(simstudy)
#From: https://cran.rstudio.com/web/packages/simstudy/vignettes/simstudy.html, and https://cran.r-project.org/web/packages/simstudy/simstudy.pdf 
def <- defData(varname = "nr", dist = "nonrandom", formula = 7, id = "idnum")
def <- defData(def, varname = "uni", dist = "uniform", formula = "10;20")
ddef <- defData(def, varname = "X1_q", formula = "nr + uni * 2", variance = 8)

set.seed(333)
theta1 = c(.2, 0.35, .7, .8, .7, .35, .2) 
knots <- c(.3, .5, .7) #quantiles
viewSplines(knots = knots, theta = theta1, degree = 3)

dt <- genData(1000, ddef)
dt <- genSpline(dt = dt, newvar = "Y_q",
                predictor = "X1_q", theta = theta1,
                knots = knots, degree = 3,
                noise.var = .25)
psych::describe (dt)
hist(dt$X1_q)
hist(dt$Y_q)
plot(dt$X1_q, dt$Y_q)
dt$X1_q_sq <- dt$X1_q * dt$X1_q
summary(lm(Y_q~ X1_q + X1_q_sq, data = dt))

1 Ответ

1 голос
/ 10 июля 2019

Как насчет этого:

X <- rnorm(1000, 0, 1)            # simulate from the normal distribution
Y <- X^2 + runif(1000, -0.1, 0.1) # make it squared +/- a little bit

Не уверен, что вы хотите смоделировать шум, но вы можете увеличить / уменьшить уровень шума, изменив два последних аргумента в функции runif. Чем дальше от 0, тем больше шума будет

Вы можете увидеть их отношения, построив их:

plot(X, Y)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...