在所有级别生成具有特定相关值的2个法向量

时间:2017-07-26 21:53:23

标签: r correlation normal-distribution

使用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

然而,有没有办法系统地做到这一点?特别是,我希望能够为第二类预先设定特定的相关值。

0 个答案:

没有答案