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

9

我想模拟一个混合数据,比如三维数据。我希望在每两个变量之间有两个不同的组成部分。

也就是说,模拟混合数据(V1和V2),其中它们之间的依赖关系是两个不同的正态分布组件。然后,在V2和V3之间有另外两个正态分布组件。因此,我将得到3D数据,第一个和第二个变量之间的依赖关系是两个正态分布的混合物。第二个和第三个变量之间的依赖关系是另外两个不同组成部分的混合物。

另一种解释我的问题的方式:

假设我想生成以下混合数据:

1- 0.3 normal(0.5,1) + 0.7 normal(2,4) # 因此,我将从两个不同的正态分布中生成双变量混合数据(混合模型的两个组成部分),混合权重的总和为1。

然后,我想按照以下方式获得另一个变量:

2- 0.5 normal(2,4) # 这是第一个模拟的第二个变量 + 0.5 normal(2,6)

因此,在这里,我得到了三维混合数据,其中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时,我们会发现它们之间的依赖结构是两种正态分布的混合,以此类推。


请指定生成V1-3的模型。 - Roman Luštrik
如果我理解你的评论,所有数据都具有不同的平均值和标准差,这是正常的。如果我的理解有误,请您明确一下。谢谢。 - user7905871
“components”这个词的含义不太清楚。我假设它的意思是模型,即V1由y ~ x1 + x2^2 + x3生成... - Roman Luštrik
2
在混合模型中,我们称生成该混合物数据的分布为混合模型的组成部分。也就是说,均值为1,标准差为2的正态分布是一个组成部分,而另一个具有不同均值的正态分布则是另一个组成部分,以此类推。 - user7905871
1个回答

5

我不太确定是否正确理解了这个问题,但我会尝试回答。您有3个分布D1、D2和D3。从这三个分布中,您想创建使用其中两个而不是相同的变量。

由于我不知道应该如何组合这些分布,所以我使用了二项式分布的标志(它是一个长度为200的0和1的向量)来确定将从哪个分布中选择每个值(如果您不想这样做,可以更改它)。

D1 = rnorm(200,2,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, size=1, prob = 0.7)
var_2 <- var_2_flag*D2 + (1 - var_2_flag)*D3

var_3_flag <- rbinom(200, size=1, prob = 0.6)
var_3 <- var_3_flag*D1 + (1 - var_3_flag)*D3

为了查看哪些值来自哪个分布,您可以执行以下操作: var_1[var_1_flag] #这将给出混合分布中来自第一个分布(D1)的值 var1[!var_1_flag] #这将给出混合分布中来自第二个分布(D2)的值
由于我发现这有点繁琐,而且我猜您可能想更改变量,因此您可能希望使用下面的函数来获得相同的结果。
create_distr <- function(observations, mean1, sd1, mean2, sd2, flag_prob) {

    flag <- rbinom(observations, size=1, prob = flag_prob)
    my_distribution <- flag * rnorm(observations, mean1, sd1) + (1 - flag) * rnorm(observations, mean2, sd2)
}

var_1 <- create_distr(200, 2, 1, 3, 1, 0.5)
var_2 <- create_distr(200, 3, 1, 1.5, 2, 0.7)
var_3 <- create_distr(200, 2, 1, 1.5, 2, 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,1,3)
  } else if (U[i] < 0.5){
    rand.samples[i] <- rnorm(1,2,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,1,3)
D2 = rnorm(N,2,5)
D3= rnorm(N,5,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*normal(1,3) + 0.2*normal(2,5) + 0.3*normal(5,2) + 0.2*自由度为2的student分布。

如果您想创建两个混合物,但在第二个混合物中保持来自正态分布的相同值,可以执行以下操作:

mixture_1 <- c(D1[U < 0.3], D2[U >= 0.3 ])
mixture_2 <- c(D1[U < 0.3], D3[U >= 0.3])

这将在两个混合物中使用与normal(1,3)相同的元素。诀窍在于不要每次使用时重新计算rnorm(N,1,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。


嗨,哦!我认为0.3 normal(0.5,1) + 0.7 normal(2,4)会给我两个变量,它们之间的依赖结构是两个正态分布normal(0.5,1) + normal(2,4)的混合。 - user7905871
normal(0.5,1) + 0.7 normal(2,4) 表示我们的观测值属于两个正态分布(30% 的观测值属于第一个正态分布,另外 70% 属于另一个正态分布)。因此,我认为我们有两个变量,并且我们想知道每个观测值是从哪里抽取的。 - user7905871
非常感谢您的帮助。我真的很想接受您的答案。然而,我理解了这个问题并且尝试了很长时间,但是没有得到我想要的结果。所以,假设我有这个0.7normal(1,3) + 0.3normal(2,5)作为二元数据。然后,我再次重复代码,以获得另一个二元数据,其中第一个变量是0.3normal(2,5)。那么新的二元数据将会像这样0.3normal(2,5)+0.7*normal(5,2)。因此,我将获得两个不同的二元数据。然后将它们合并,因为V2是这两个数据之间的共同变量。 - user7905871
是的,这就是我的问题。然后,我将生成4个变量,其中V1和V2之间的依赖关系是正态分布的混合。V2(0.3normal(2,5) 和 V3是正态分布和t分布的混合(例如)。 - user7905871
仅供参考。混合权重的总和(例如0.7和0.3)必须等于一。 - user7905871
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接