模拟每两个变量之间具有不同混合依赖结构的混合数据?

我想模拟混合数据,比如三维数据.我想在每两个变量之间有两个不同的组件.

也就是说,模拟混合数据(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由另一种不同的混合成分生成.

这是如何在r中生成数据:(我相信它不会生成双变量数据)

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时,我们会发现它们之间的依赖关系结构是两个法线的混合,依此类推.

我不确定我是否正确理解了这个问题,但我会试一试.你有3个发行版D1,D2和D3.从这三个发行版中,您希望创建使用其中2个而不是相同的变量的变量.

由于我不知道应该如何组合分布,我使用二项分布(它的长度等于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.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...