使用rmvnorm
,我可以生成2个标准法向量 x 和 y ,其属性是它们在某些分类变量的不同级别之间具有某些相关性。例如,如果我想要 x 和 y 为25%,50%和75%在3个级别相关,我可以这样做:
library(mvtnorm)
library(tidyverse)
n_obs <- 15000
set.seed(42)
z.1 <- rmvnorm(n_obs/3, sigma = matrix(c(1, 0.25, 0.25, 1), ncol = 2))
z.2 <- rmvnorm(n_obs/3, sigma = matrix(c(1, 0.5, 0.5, 1), ncol = 2))
z.3 <- rmvnorm(n_obs/3, sigma = matrix(c(1, 0.75, 0.75, 1), ncol = 2))
z <- rbind(z.1, z.2, z.3)
df <- tibble(x = z[,1],
y = z[,2],
cat.a = c(rep("A1", n_obs/3), rep("A2", n_obs/3), rep("A3", n_obs/3)),
cat.b = rep(c("B1", "B2"), n_obs/2))
df %>%
group_by(cat.a) %>%
summarize(cor = cor(x, y))
返回
## # A tibble: 3 x 2
## cat.a cor
## <chr> <dbl>
## 1 A1 0.2381375
## 2 A2 0.4880839
## 3 A3 0.7508989
有没有办法拥有超过1个分类变量,这样我就可以生成2个向量,这些向量在每个类别的所有级别都有所需的相关性?例如,我可以按如下方式操纵 x
df %>%
group_by(cat.b) %>%
summarize(cor = cor(x, y))
## # A tibble: 2 x 2
## cat.b cor
## <chr> <dbl>
## 1 B1 0.4941775
## 2 B2 0.4940611
df2 <- df %>%
mutate(x = ifelse(cat.b == "B1", x + 0.2*y,
ifelse(cat.b == "B2", x - 0.2*y,
x))) %>%
mutate(x = as.numeric(scale(x)))
df2 %>%
group_by(cat.b) %>%
summarize(cor = cor(x, y))
## # A tibble: 2 x 2
## cat.b cor
## <chr> <dbl>
## 1 B1 0.6239066
## 2 B2 0.3207415
更改第二类的相关性,而不会对第一类中的相关性产生重大影响。
df2 %>%
group_by(cat.a) %>%
summarize(cor = cor(x, y))
## # A tibble: 3 x 2
## cat.a cor
## <chr> <dbl>
## 1 A1 0.2330728
## 2 A2 0.4818041
## 3 A3 0.7359741
然而,有没有办法系统地做到这一点?特别是,我希望能够为第二类预先设定特定的相关值。