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

  • 本文关键字:两个 概率分布 相关性 之间 r cdf
  • 更新时间 :
  • 英文 :


我想创建一个相关的逆累积分布。例如,目前我有两个逆分布,如下所示,但我想导出一个相关性,例如-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个变量的均值和标准差存储在向量meansstdevs中,你可以这样做:

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)

相关内容

  • 没有找到相关文章

最新更新