从参数相关的线性模型模拟 R 中的数据
Simulate data in R from a linear model where the parameters are correlated
我想在 R 中模拟来自以下模型的数据
Y ~ N(b0 + b1*X, sigma)
并在 R
中拟合以下模型
lm(Y ~ 1 + X, data)
R 代码大致如下,
nsims = 1000
X = 1:50
b0 = rnorm(nsims, 55.63, 31.40)
b1 = rnorm(nsims, 1.04, .39)
sigma = rnorm(nsims, 11.34, 4.11)
要注意的是,我希望 b0
、b1
和 sigma
相互关联。我希望他们有这个相关性。
R <- matrix(c(1, .16, .54,
.16, 1, .13,
.54, .13, 1),
nrow = 3)
colnames(R) <- c("b0", "b1", "sigma")
既然我想要这个相关结构,我上面的 rnorm
代码是错误的。如果我的数据不需要这个相关矩阵,我可能会这样做,
sim_data <- data.frame()
for(i in 1:nsims){
Y = b0[i] + b1[i]*X + rnorm(length(X), 0, sigma[i])
data_tmp <- data.frame(Y = Y, X = X, ID = i)
sim_data <- rbind(sim_data, data_tmp)
}
但是由于我生成参数的方式,这忽略了我的相关结构。任何人都可以给我一些建议或指示,在哪里寻找如何合并相关性?
模拟 3 维正态分布并从中获取变量。您可以使用 MASS
包进行多变量模拟,使用 MBESS
包进行从相关矩阵到 mvrnorm
函数所需的协方差矩阵的转换。
library(MASS)
library(MBESS)
R <- matrix(c(1, .16, .54,
.16, 1, .13,
.54, .13, 1),
nrow = 3)
SD <- c(31.40, .39, 4.11)
## convert correlation matrix to covariance matrix
Cov <- cor2cov(R, SD)
### you can also do it algebraically without MBESS package
### Cov <- SD %*% t(SD) * R
### where %*% is matrix multiplication and * is normal multiplication
### t() is transpose function
# simulate multivariate normal distribution
mvnorm <- mvrnorm(
1000,
mu = c(55.63, 1.04, 11.34),
Sigma = Cov,
empirical = T
)
# check whether correlation matrix is right
cor(mvnorm)
[,1] [,2] [,3]
[1,] 1.00 0.16 0.54
[2,] 0.16 1.00 0.13
[3,] 0.54 0.13 1.00
# extract variables
b0 <- mvnorm[, 1]
b1 <- mvnorm[, 2]
sigma <- mvnorm[, 3]
我想在 R 中模拟来自以下模型的数据
Y ~ N(b0 + b1*X, sigma)
并在 R
中拟合以下模型lm(Y ~ 1 + X, data)
R 代码大致如下,
nsims = 1000
X = 1:50
b0 = rnorm(nsims, 55.63, 31.40)
b1 = rnorm(nsims, 1.04, .39)
sigma = rnorm(nsims, 11.34, 4.11)
要注意的是,我希望 b0
、b1
和 sigma
相互关联。我希望他们有这个相关性。
R <- matrix(c(1, .16, .54,
.16, 1, .13,
.54, .13, 1),
nrow = 3)
colnames(R) <- c("b0", "b1", "sigma")
既然我想要这个相关结构,我上面的 rnorm
代码是错误的。如果我的数据不需要这个相关矩阵,我可能会这样做,
sim_data <- data.frame()
for(i in 1:nsims){
Y = b0[i] + b1[i]*X + rnorm(length(X), 0, sigma[i])
data_tmp <- data.frame(Y = Y, X = X, ID = i)
sim_data <- rbind(sim_data, data_tmp)
}
但是由于我生成参数的方式,这忽略了我的相关结构。任何人都可以给我一些建议或指示,在哪里寻找如何合并相关性?
模拟 3 维正态分布并从中获取变量。您可以使用 MASS
包进行多变量模拟,使用 MBESS
包进行从相关矩阵到 mvrnorm
函数所需的协方差矩阵的转换。
library(MASS)
library(MBESS)
R <- matrix(c(1, .16, .54,
.16, 1, .13,
.54, .13, 1),
nrow = 3)
SD <- c(31.40, .39, 4.11)
## convert correlation matrix to covariance matrix
Cov <- cor2cov(R, SD)
### you can also do it algebraically without MBESS package
### Cov <- SD %*% t(SD) * R
### where %*% is matrix multiplication and * is normal multiplication
### t() is transpose function
# simulate multivariate normal distribution
mvnorm <- mvrnorm(
1000,
mu = c(55.63, 1.04, 11.34),
Sigma = Cov,
empirical = T
)
# check whether correlation matrix is right
cor(mvnorm)
[,1] [,2] [,3]
[1,] 1.00 0.16 0.54
[2,] 0.16 1.00 0.13
[3,] 0.54 0.13 1.00
# extract variables
b0 <- mvnorm[, 1]
b1 <- mvnorm[, 2]
sigma <- mvnorm[, 3]