使用分类变量模拟逻辑回归数据

机器算法验证 r 物流 模拟
2022-03-15 04:19:52

我试图为逻辑回归创建一些测试数据,我发现这篇文章如何模拟逻辑回归的人工数据?

这是一个很好的答案,但它只创建连续变量。对于与链接中的相同示例,与 y 关联的具有 5 个级别 (ABCDE) 的分类变量 x3 怎么样?

1个回答

该模型

X=1如果一个人属于“B”类,并且X=0除此以外。定义XC,XD, 和X相似。如果X=XC=XD=X=0,那么我们就有了类别“A”(即“A”是参考水平)。然后你的模型可以写成

罗吉特(π)=β0+βX+βCXC+βDXD+βX
β0拦截。


R中的数据生成

(一种)

x <- sample(x=c("A","B", "C", "D", "E"), 
              size=n, replace=TRUE, prob=rep(1/5, 5))

x向量具有n组件(每个人一个)。每个组件是“A”、“B”、“C”、“D”或“E”。“A”、“B”、“C”、“D”和“E”中的每一个都是同样可能的。

(二)

library(dummies)
dummy(x)

dummy(x)是一个矩阵,有n行(每个人一个)和 5 列对应于X一种,X,XC,XD, 和X. 然后线性预测变量(每个人一个)可以写成

linpred <- cbind(1, dummy(x)[, -1]) %*% c(beta0, betaB, betaC, betaD, betaE)

(C)

成功的概率来自逻辑模型:

pi <- exp(linpred) / (1 + exp(linpred))

(d)

现在我们可以生成二进制响应变量。一世响应来自二项式随机变量(n,p)n=1p= pi[i]

y <- rbinom(n=n, size=1, prob=pi)

一些快速模拟来检查这是否可以

> #------ parameters ------
> n <- 1000 
> beta0 <- 0.07
> betaB <- 0.1
> betaC <- -0.15
> betaD <- -0.03
> betaE <- 0.9
> #------------------------
> 
> #------ initialisation ------
> beta0Hat <- rep(NA, 1000)
> betaBHat <- rep(NA, 1000)
> betaCHat <- rep(NA, 1000)
> betaDHat <- rep(NA, 1000)
> betaEHat <- rep(NA, 1000)
> #----------------------------
> 
> #------ simulations ------
> for(i in 1:1000)
+ {
+   #data generation
+   x <- sample(x=c("A","B", "C", "D", "E"), 
+               size=n, replace=TRUE, prob=rep(1/5, 5))  #(a)
+   linpred <- cbind(1, dummy(x)[, -1]) %*% c(beta0, betaB, betaC, betaD, betaE)  #(b)
+   pi <- exp(linpred) / (1 + exp(linpred))  #(c)
+   y <- rbinom(n=n, size=1, prob=pi)  #(d)
+   data <- data.frame(x=x, y=y)
+   
+   #fit the logistic model
+   mod <- glm(y ~ x, family="binomial", data=data)
+   
+   #save the estimates
+   beta0Hat[i] <- mod$coef[1]
+   betaBHat[i] <- mod$coef[2]
+   betaCHat[i] <- mod$coef[3]
+   betaDHat[i] <- mod$coef[4]
+   betaEHat[i] <- mod$coef[5]
+ }
> #-------------------------
> 
> #------ results ------
> round(c(beta0=mean(beta0Hat), 
+         betaB=mean(betaBHat), 
+         betaC=mean(betaCHat), 
+         betaD=mean(betaDHat), 
+         betaE=mean(betaEHat)), 3)
 beta0  betaB  betaC  betaD  betaE 
 0.066  0.100 -0.152 -0.026  0.908 
> #---------------------