我想为20项研究产生三个相关结果。每项研究有3组(对照组,治疗组1和治疗组2)。对于对照组,我的生成值是:mean = 0,sd = 1;对于两个治疗组,我的生成值是:mean = 0.40,sd = 1。我想要完成的两件事(我遇到了麻烦):
1)条件1:我想生成相关结果,以便每对结果之间存在不同的相关性。应从相关矢量中采样相关,rho = c(0.6,0.7,0.8);和
2)条件2:我想生成相关结果,以便研究的一个子集(一半)将来自相关向量的样本,rho1 = c(0.6,0.7,0.8),另一个子集(剩余的)将从相关矢量中采样一半,rho2 = c(0.3,0.4,0.5)
我正在使用“mvtnorm”包来生成每个组的结果。这是我的代码(请原谅我对模拟和R的基本知识):
library(“mvtnorm”)
set.seed(0307)
mean_c = c(0, 0, 0)
mean_t1 = c(0.4, 0.4, 0.4)
mean_t2 = c(0.4. 0.4, 0.4)
k <- 20 # no. of studies
n <- 50 # sample size
rho <- # the value is sampled from a vector of correlations
for (i in 1:k) {
Yc <-rmvnorm(n=n, mean=mean_c, sigma=rho)
Yt1<-rmvnorm(n=n, mean=mean_t1, sigma=rho)
Yt2 <-rmvnorm(n=n, mean=mean_t2, sigma=rho)
}
我感谢编程专家提供的任何意见。谢谢!
答案 0 :(得分:1)
我不确定我是否明白你的问题。
但是为了防止它对你有所帮助,我在这里提供了一个使用你的&#34;数据&#34;的rmvnorm函数的例子。我修改了一些数字以清除所有依赖项
library(mvtnorm)
set.seed(1234)
k = 10000
means = c(0, 0.4, 0.4)
sigmas = c(2, 1, 1)
rhoXY = 0.6
rhoXZ = 0.7
rhoYZ = 0.8
varMatrix <- matrix(c(
sigmas[1]*sigmas[1], rhoXY*sigmas[1]*sigmas[2], rhoXZ*sigmas[1]*sigmas[3],
rhoXY*sigmas[1]*sigmas[2], sigmas[2]*sigmas[2], rhoYZ*sigmas[2]*sigmas[3],
rhoXZ*sigmas[1]*sigmas[3], rhoYZ*sigmas[2]*sigmas[3], sigmas[3]*sigmas[3]
),
ncol=3, byrow=TRUE)
# Generate data
Yc <- rmvnorm(n = k,
mean = means,
sigma = varMatrix, method="chol")
# Check data satisfies what it should
colMeans(Yc)
var(Yc)
cor(Yc[,1], Yc[,2])
cor(Yc[,1], Yc[,3])
cor(Yc[,2], Yc[,3])
检查输出
> colMeans(Yc)
[1] 0.007118385 0.406214538 0.401605464
> var(Yc)
[,1] [,2] [,3]
[1,] 4.024896 1.2026685 1.4204561
[2,] 1.202668 0.9998153 0.8046641
[3,] 1.420456 0.8046641 1.0052659
> cor(Yc[,1], Yc[,2])
[1] 0.599527
> cor(Yc[,1], Yc[,3])
[1] 0.7061712
> cor(Yc[,2], Yc[,3])
[1] 0.802628
答案 1 :(得分:0)
感谢您的电子邮件,很高兴被问到!我不完全理解rmvnorm函数(或你的请求!),但看起来Roc回答了你的问题。然而,使用两半中的不同rho值,执行该功能20次是很简单的。我的代码可能不是最优雅的 - 有可能通过一次调用rmvnorm来生成所有这些数据,而不是像我的代码那样生成20,但这似乎工作得很好。您可以像使用方括号一样访问20项研究的结果。
library(mvtnorm)
set.seed(1234)
k = 10000
means = c(0, 0.4, 0.4)
sigmas = c(1, 1, 1)
rho.type1 <- c(0.3, 0.4, 0.5)
rho.type2 <- c(0.6, 0.7, 0.8)
study.number <-20
Yc <- matrix(0, ncol = 3, nrow = k* study.number)
for(i in 1: study.number)
{
ifelse(i < 11, rho <- rho.type1, rho <- rho.type2)
varMatrix <- matrix(c(
sigmas[1]*sigmas[1], rho[1]*sigmas[1]*sigmas[2], rho[2]*sigmas[1]*sigmas[3],
rho[1]*sigmas[1]*sigmas[2], sigmas[2]*sigmas[2], rho[3]*sigmas[2]*sigmas[3],
rho[2]*sigmas[1]*sigmas[3], rho[3]*sigmas[2]*sigmas[3], sigmas[3]*sigmas[3]
),
ncol=3, byrow=TRUE)
# Generate data, and save the 20 datasets in a list called Yc
Yc[(1 + (i-1)*k):(i*k), ] <- rmvnorm(n = k,
mean = means,
sigma = varMatrix, method="chol")
}
Yc <- data.frame(Yc, study = rep(1:20, each = k))
# Check output
cor(Yc[Yc$study==1,1], Yc[Yc$study==1,2]) # To check the first entry in the list
for(i in 1:20) print(cor(Yc[Yc$study==i,1], Yc[Yc$study==i,2])) # To check the lot