我想创建一个相关的逆累积分布。例如,目前我有两个逆分布,如下所示,但我想导出一个相关性,例如-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)
如果您有15个具有相关矩阵CC
的变量,您可以使用高斯copula来获得相关的一致变量,使用CC
的Cholesky分解,然后像上面所做的那样用指定的边际值反转这些变量。(例如,请参见此处(。
nv <- NROW(CC)
num_samples <- 1000
A <- matrix(rnorm(num_samples * nv), ncol = nv)
U <- pnorm(A %*% chol(CC))
如果你的15个变量的均值和标准差存储在向量means
和stdevs
中,你可以这样做:
rv <- sapply(1:nv, function(i) qlnorm(U[,i], meanlog = means[i], sdlog = stdevs[i]))
rv
是您模拟的变量,具有接近所需的相关性结构,您可以使用cor(rv)
进行检查。
以下内容适合您吗?
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)