我不太确定是否正确理解了这个问题,但我会尝试回答。您有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
U <- runif(N)
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
U <- runif(N)
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。
y ~ x1 + x2^2 + x3
生成... - Roman Luštrik