gpt4 book ai didi

r - 生成与现有变量具有预定义相关性的二元变量

转载 作者:行者123 更新时间:2023-12-02 19:00:39 25 4
gpt4 key购买 nike

对于模拟研究,我想生成一组随机变量(连续变量和二进制变量),这些随机变量与一个已经存在的二进制变量有预定义的关联,这里表示为x.

对于这篇文章,假设 x 是按照下面的代码生成的。但请记住:在现实生活中,x 是一个已经存在的变量。

set.seed(1245)
x <- rbinom(1000, 1, 0.6)

我想同时生成一个二元变量和一个连续变量。我已经想出如何生成一个连续变量(见下面的代码)

set.seed(1245)

cor <- 0.8 #Correlation
y <- rnorm(1000, cor*x, sqrt(1-cor^2))

但我找不到生成与现有变量 x 相关的二进制变量的方法。我发现了几个 R 包,例如 copula,它可以生成具有给定依赖结构的随机变量。但是,它们不提供生成对已存在变量具有集合依赖性的变量的可能性。

有谁知道如何有效地做到这一点?

谢谢!

最佳答案

如果我们看一下相关公式:

enter image description here

对于新向量 y,如果我们保留均值,问题就更容易解决。这意味着我们复制向量 x 并尝试翻转相同数量的 1 和 0 以获得预期的相关值。

如果我们让 E(X) = E(Y) = x_barE(XY) = xy_bar,那么对于给定的 rho,我们简化上面的到:

(xy_bar - x_bar^2) / (x_bar - x_bar^2) =  rho

求解,我们得到:

xy_bar = rho * x_bar + (1-rho)*x_bar^2

我们可以推导一个函数来翻转多个 1 和 0 以获得结果:

create_vector = function(x,rho){

n = length(x)
x_bar = mean(x)
xy_bar = rho * x_bar + (1-rho)*x_bar^2
toflip = sum(x == 1) - round(n * xy_bar)

y = x
y[sample(which(x==0),toflip)] = 1
y[sample(which(x==1),toflip)] = 0
return(y)
}

对于您的示例,它有效:

set.seed(1245)
x <- rbinom(1000, 1, 0.6)
cor(x,create_vector(x,0.8))
[1] 0.7986037

有一些预期的 rho 和 p 的极端组合,您可能会遇到问题,例如:

set.seed(111)

res = lapply(1:1000,function(i){

this_rho = runif(1)
this_p = runif(1)
x = rbinom(1000,1,this_p)
data.frame(
intended_rho = this_rho,
p = this_p,
resulting_cor = cor(x,create_vector(x,this_rho))
)
})

res = do.call(rbind,res)

ggplot(res,aes(x=intended_rho,y=resulting_cor,col=p)) + geom_point()

enter image description here

关于r - 生成与现有变量具有预定义相关性的二元变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65628556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com