也就是说,模拟混合数据(V1和V2),其中它们之间的依赖关系是两个不同的正常分量.然后,在V2和V3之间另外两个正常组件.所以,我将得到3d数据,第一个和第二个变量之间的相关性是两个法线的混合.并且第二和第三变量之间的依赖性是另外两个不同组分的混合.
另一种解释我问题的方法:
假设我想生成如下混合数据:
1- 0.3正常(0.5,1)0.7正常(2,4)#因此在这里我将获得由两个不同法线(混合模型的两个分量)生成的双变量混合数据,混合器重量的总和为1.
然后,我想得到另一个变量如下:
2- 0.5 normal(2,4)#这是第一个模拟的第二个变量0.5 normal(2,6)
所以在这里,我得到了3d模拟混合数据,其中V1和V2由两种不同的混合成分生成,V2和V3由另一种不同的混合成分生成.
N <- 100000 #Sample N random uniforms U U <- runif(N) #Variable to store the samples from the mixture distribution rand.samples <- rep(NA,N) #Sampling from the mixture for(i in 1:N) { if(U[i]<.3) { rand.samples[i] <- rnorm(1,1,3) } else { rand.samples[i] <- rnorm(1,2,5) } }
因此,如果我们生成混合双变量数据(两个变量),那么如何将其扩展为具有4或5个变量,其中V1和V2由两个不同的法线生成(它们之间的依赖关系结构是两个法线的混合)然后V3将从另一个不同的法线生成,然后用V2进行补偿.也就是说,当我们绘制V2~V3时,我们会发现它们之间的依赖关系结构是两个法线的混合,依此类推.
由于我不知道应该如何组合分布,我使用二项分布(它的长度等于200的矢量,0和1)的标志来确定每个值将被选择的分布(你可以改变它,如果那样不是你想要它完成的方式).
D1 = rnorm(200,1) D2 = rnorm(200,3,1) D3= rnorm(200,1.5,2)
为了创建混合分布,我们可以使用rbinom函数根据所选概率创建1和0的向量.这是从两个分布中获得一些值的方法.
var_1_flag <- rbinom(200,size=1,prob = 0.3) var_1 <- var_1_flag*D1 + (1 - var_1_flag)*D2 var_2_flag <- rbinom(200,prob = 0.7) var_2 <- var_2_flag*D2 + (1 - var_2_flag)*D3 var_3_flag <- rbinom(200,prob = 0.6) var_3 <- var_3_flag*D1 + (1 - var_3_flag)*D3
要查看哪些值来自哪个分布,您可以执行以下操作:
var_1 [var_1_flag] #This为您提供来自第一个分布(D1)的混合分布中的值
var1 [!var_1_flag] #This为您提供来自第二个分布的混合分布中的值(D2)
由于我发现这有点手动,我猜你可能想要更改变量,你可能想使用下面的函数来获得相同的结果
create_distr <- function(observations,mean1,sd1,mean2,sd2,flag_prob) { flag <- rbinom(observations,prob = flag_prob) my_distribution <- flag * rnorm(observations,sd1) + (1 - flag) * rnorm(observations,sd2) } var_1 <- create_distr(200,0.5) var_2 <- create_distr(200,0.7) var_3 <- create_distr(200,0.6)
如果您希望混合使用两个以上的变量(发行版),您可以扩展您提供的代码,如下所示:
N <- 100000 #Sample N random uniforms U U <- runif(N) #Variable to store the samples from the mixture distribution rand.samples <- rep(NA,N) for(i in 1:N) { if(U[i] < 0.3) { rand.samples[i] <- rnorm(1,3) } else if (U[i] < 0.5){ rand.samples[i] <- rnorm(1,5) } else if (U[i] < 0.8) { rand.samples[i] <- rnorm(1,5,2) } else { rand.samples[i] <- rt(1,2) } }
这样,每个元素从每个分布中一次一个地获取.如果您希望获得相同的结果,但不一次只取一个元素,则可以执行以下操作:
N <- 100000 #Sample N random uniforms U U <- runif(N) #Variable to store the samples from the mixture distribution rand.samples <- rep(NA,N) D1 = rnorm(N,3) D2 = rnorm(N,5) D3= rnorm(N,2) D4 = rt(N,2) rand.samples <- c(D1[U < 0.3],D2[U >= 0.3 & U < 0.5],D3[U >= 0.5 & U < 0.8],D4[U >= 0.8])
对应于0.3 *正常(1,3)0.2 *正常(2,5)0.3 *正常(5,2)0.2 *学生(2自由度)
如果要创建两个混合,但在第二个中保留与正态分布相同的值,则可以执行以下操作:
mixture_1 <- c(D1[U < 0.3],D2[U >= 0.3 ]) mixture_2 <- c(D1[U < 0.3],D3[U >= 0.3])
这将在两种混合物中使用与正常(1,3)完全相同的元素.诀窍是每次使用时不重新计算rnorm(N,3).并且在两种情况下,样品由大约来自第一个法线(D1)的30%和来自第二个分布的大约70%组成.例如:
set.seed(1) N <- 100000 U <- runif(N) > prop.table(table(U < 0.3)) FALSE TRUE 0.6985 0.3015
U向量中30%的值低于0.3.