如何在 [r] 中引入两个逆累积概率分布之间的相关性?

How to induce correlations between two inverse cumulative probability distributions in [r]?

我想创建一个相关的逆累积分布。例如,目前我有两个逆分布,如下所示,但想得出例如 -0.5 的相关性。有什么办法可以实现吗?


library(lognorm)
library(dplyr)

Var_a <- tbl_df(qlnorm(runif(1000), meanlog = 0.0326, sdlog = 0.0288))
var_b <- tbl_df(qlnorm(runif(1000), meanlog = 0.0452, sdlog = 0.0364))

cor(Var_a, var_b)

下面的方法对你有用吗?

set.seed(100)
x1 <- rnorm(1000)
y1 <- rnorm(1000) - .6 * x1

x2 = pnorm(x1)
y2 = pnorm(y1)

cor(cbind(x2, y2))
#            x2         y2
# x2  1.0000000 -0.4995593
# y2 -0.4995593  1.0000000

Var_a <- tbl_df(qlnorm(x2, meanlog = 0.0326, sdlog = 0.0288))
var_b <- tbl_df(qlnorm(y2, meanlog = 0.0452, sdlog = 0.0364))

cor(Var_a, var_b)
#            value
# value -0.5239145

更新:仍然对你在做什么感到困惑,但如果你只想将我所做的应用到 15 个变量上,可以做这样的事情吗?

library(MASS)
sigma <- matrix(.5, nrow = 15, ncol = 15) + diag(15)*.5  #your correlation matrix
sigma
vars <- mvrnorm(1000, mu = rep(0, 15), Sigma = sigma)
vars
cor(vars)
vars2 <- pnorm(vars)
cor(vars2)
#use each of these as variable in qlnorm

vars2 <- data.frame(vars2)
names(vars2)
vars2

vars2[paste("log_", 1:15)] <- lapply(vars2[, 1:15], function(x) {qlnorm(x, meanlog = 0.0326, sdlog = 0.0288)})
names(vars2)
vars2 <- vars2[, -c(1:15)]
cor(vars2)

如果你有 15 个具有相关矩阵 CC 的变量,你可以使用高斯 copula 来获得相关的均匀变量,使用 CC 的 Cholesky 分解,然后用你指定的边际反转那些就像你上面做的那样。 (例如See here)。

nv <- NROW(CC)
num_samples <- 1000
A <- matrix(rnorm(num_samples * nv), ncol = nv)
U <- pnorm(A %*% chol(CC))

如果您的 15 个变量的均值和标准差存储在向量 meansstdevs 中,您可以:

rv <- sapply(1:nv, function(i) qlnorm(U[,i], meanlog = means[i], sdlog = stdevs[i]))

rv 是您的模拟变量,与所需的相关结构接近,您可以使用 cor(rv) 进行检查。