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

前端之家收集整理的这篇文章主要介绍了模拟每两个变量之间具有不同混合依赖结构的混合数据?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想模拟混合数据,比如三维数据.我想在每两个变量之间有两个不同的组件.

也就是说,模拟混合数据(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.

原文链接:https://www.f2er.com/javaschema/281496.html

猜你在找的设计模式相关文章