我想生成两个变量。一个是二元结果变量(比如成功/失败),另一个是年龄。我希望年龄与成功呈正相关。例如,在较高年龄段的成功率应该高于在较低年龄段的成功率。理想情况下,我应该能够控制相关程度。我怎么做?
谢谢
我想生成两个变量。一个是二元结果变量(比如成功/失败),另一个是年龄。我希望年龄与成功呈正相关。例如,在较高年龄段的成功率应该高于在较低年龄段的成功率。理想情况下,我应该能够控制相关程度。我怎么做?
谢谢
您可以模拟逻辑回归模型。
更准确地说,您可以首先生成年龄变量的值(例如使用均匀分布),然后使用计算成功概率
在哪里和是要指定的常数回归系数。尤其,控制成功与年龄之间关联的大小。
具有以下值,您现在可以使用伯努利分布生成二进制结果变量的值。
R中的说明性示例:
n <- 10
beta0 <- -1.6
beta1 <- 0.03
x <- runif(n=n, min=18, max=60)
pi_x <- exp(beta0 + beta1 * x) / (1 + exp(beta0 + beta1 * x))
y <- rbinom(n=length(x), size=1, prob=pi_x)
data <- data.frame(x, pi_x, y)
names(data) <- c("age", "pi", "y")
print(data)
age pi y
1 44.99389 0.4377784 1
2 38.06071 0.3874180 0
3 48.84682 0.4664019 1
4 24.60762 0.2969694 0
5 39.21008 0.3956323 1
6 24.89943 0.2988003 0
7 51.21295 0.4841025 1
8 43.63633 0.4277811 0
9 33.05582 0.3524413 0
10 30.20088 0.3331497 1
@ocram 的方法肯定会奏效。就依赖属性而言,它有点限制。
另一种方法是使用 copula 导出联合分布。您可以指定成功和年龄的边际分布(如果您有现有数据,这尤其简单)和 copula 族。改变copula的参数会产生不同程度的依赖,不同的copula族会给你带来不同的依赖关系(例如强上尾依赖)。
此处提供了通过 copula 包在 R 中执行此操作的最新概述。另请参阅该论文中的讨论以获取其他软件包。
不过,您不一定需要整个软件包;这是一个使用高斯 copula、边际成功概率 0.6 和伽马分布年龄的简单示例。改变 r 以控制依赖性。
r = 0.8 # correlation coefficient
sigma = matrix(c(1,r,r,1), ncol=2)
s = chol(sigma)
n = 10000
z = s%*%matrix(rnorm(n*2), nrow=2)
u = pnorm(z)
age = qgamma(u[1,], 15, 0.5)
age_bracket = cut(age, breaks = seq(0,max(age), by=5))
success = u[2,]>0.4
round(prop.table(table(age_bracket, success)),2)
plot(density(age[!success]), main="Age by Success", xlab="age")
lines(density(age[success]), lty=2)
legend('topright', c("Failure", "Success"), lty=c(1,2))
输出:
桌子:
success
age_bracket FALSE TRUE
(0,5] 0.00 0.00
(5,10] 0.00 0.00
(10,15] 0.03 0.00
(15,20] 0.07 0.03
(20,25] 0.10 0.09
(25,30] 0.07 0.13
(30,35] 0.04 0.14
(35,40] 0.02 0.11
(40,45] 0.01 0.07
(45,50] 0.00 0.04
(50,55] 0.00 0.02
(55,60] 0.00 0.01
(60,65] 0.00 0.00
(65,70] 0.00 0.00
(70,75] 0.00 0.00
(75,80] 0.00 0.00
您可以先生成成功/失败变量(),然后生成年龄() 具有不同的分布,具体取决于. 这会给你相关性。
要量化相关性,最简单的方法是移位根据价值. 您移动的量将是相关性的衡量标准。