首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟两个变量之间具有不同混合依赖结构的混合数据?

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

Stack Overflow用户
提问于 2017-04-29 09:05:33
回答 1查看 694关注 0票数 9

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

也就是说,模拟混合数据(V1和V2),其中它们之间的依赖关系是两个不同的正常组件。然后,在V2和V3之间另有两个正常成分。所以,我有三维数据,第一个变量和第二个变量之间的相关性是两个法线的混合。第二变量和第三变量之间的相关性是另两个不同成分的混合物。

另一种解释我问题的方法是:

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

1- 0.3正态(0.5,1 )+ 0.7正态(2,4)#因此,我将从两个不同的法线(混合模型的两个分量)中得到一个二元混合数据,混合权之和为1。

然后,我想得到另一个变量如下:

2- 0.5正规(2,4)#这是第一次模拟+ 0.5正常(2,6)的第二个变量。

在这里,我得到了三维模拟混合数据,其中V1和V2由两个不同的混合组分生成,V2和V3由另一个不同的混合组分生成。

这就是在r中生成数据的方法:(我相信它不是生成二元数据)

代码语言:javascript
复制
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时,我们会发现它们之间的依赖结构是两个法线的混合体,依此类推。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-02 16:05:35

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

由于我不知道应该如何组合发行版,所以我使用二项分布(它是长度等于200的向量,包含0和1s)来确定将从哪个分布中选择每个值(如果这不是您想要的那样的话)。

代码语言:javascript
复制
D1 = rnorm(200,2,1)
D2 = rnorm(200,3,1)
D3= rnorm(200,1.5,2)

为了建立混合分布,我们可以利用rbinom函数根据选定的概率生成1s和0的向量。这是从两个发行版中获得一些值的一种方法。

代码语言:javascript
复制
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)的混合发行版中的值。

因为我发现这有点手动,而且我猜您可能想要更改变量,所以您可能需要使用下面的函数来获得相同的结果。

代码语言:javascript
复制
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)

如果希望在混合中有两个以上的变量(发行版),可以按以下方式扩展您提供的代码:

代码语言:javascript
复制
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)
  }
}

这样,每个元素就会从每个发行版中一次得到一个。如果您希望得到相同的结果,但不每次使用每个元素,则可以执行以下操作:

代码语言:javascript
复制
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*正常(1,3)+0.2*正常(2,5)+0.3*正常(5,2)+0.2*学生(2自由度)

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

代码语言:javascript
复制
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,1,3)时重新计算它。在这两种情况下,样本由来自第一正态分布(D1)的约30%和来自第二分布的约70%组成。例如:

代码语言:javascript
复制
    set.seed(1)
    N <- 100000   
    U <- runif(N)
    > prop.table(table(U < 0.3))

 FALSE   TRUE 
0.6985 0.3015 

U向量中30%的值小于0.3。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43693768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档