向与一两个现有数据相关的现有数据添加新变量

Adding new variables to existing data that correlate with one or two existing ones

如何在满足以下条件的情况下再添加两个变量?

  1. 变量“c”与变量“a”的相关性为 0.7。
  2. 如果可能,同时与“a”和“b”相关的变量“d”。

模拟数据

n = 100

d = tibble(a = rnorm(n, 50, 20),
           b = rnorm(n, 10, 0.4))

d

非常感谢 Tidyverse 解决方案!

这是一个小函数,它接受一个向量 x 和一个所需的 rho 和 returns 一个向量,使得 cor(<vector>,x) == rho`).

f <- function(x,rho) {
  orth = lm(runif(length(x))~x)$residuals
  rho*sd(orth)*x + orth*sd(x)*sqrt(1-rho^2)
}

现在我们将函数应用到列 a 以创建一个列 c 使得 cor(a,c) == 0.7

d %>%  mutate(c = f(a,.7))

使用在 mc2d 包中开发的 Iman 和 Conover 方法 (1982)(一个 rank 相关结构)。

library(mc2d)
cc <- rnorm(n,50,20)
cc <- cornode(cbind(d$a,cc), target=0.7)[,"cc"]
d$c <- cc
cor(d)

对于不止一个变量,你必须建立一个相关矩阵。

## Target
(corrTarget <- matrix(c(1, 0.7, 0.7, 0.7, 1, 0.7, 0.7, 0.7, 1), ncol=3))

dd <- rnorm(n,50,20)
dd <- cornode(cbind(a=d$a,b=d$b,dd), target=corrTarget)
cor(dd)
d$b <- dd[,"b"]
d$d <- dd[,"dd"]

cor(d)

应检查最终的关联结构,因为并非总能构建目标关联结构。

第二个实际上更容易(至少对我而言):只需从 a 和 b 中得到 z-scores,然后将它们相加或取平均值。它将与 a 和 b 相关联 0.7

d <- d %>% 
  mutate(d=((a - mean(a)) / sd(a)) +
           ((b- mean(b)) / sd(b)))