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


9

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

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


sample(x = c(1,2,3),size = 1,prob = rep(1/3,3))以相等的概率生成“ 1”,“ 2”或“ 3”之一。
ocram

感谢您的评论,但是如何将此处的概率与我提到的帖子的y相关联?我从该帖子的``代码''中复制一些代码> set.seed(666)> x1 = rnorm(1000)#一些连续变量> x2 = rnorm(1000)> z = 1 + 2 * x1 + 3 * x2#线性组合偏差> pr = 1 /(1 + exp(-z))#通过inv-logit函数> y = rbinom(1000,1,pr)#bernoulli响应变量“代码”
user1301295 2013年

Answers:


13

该模型

xB=1 如果某人的类别为“ B”,并且 xB=0除此以外。限定xCxDxE相似点。如果xB=xC=xD=xE=0,则我们有类别“ A”(即“ A”是参考级别)。您的模型可以写成

logit(π)=β0+βBxB+βCxC+βDxD+βExE
β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”中的每一个都同样可能。

(b)

library(dummies)
dummy(x)

dummy(x)是一个矩阵,n其中有行(每个人一个)和5列,分别对应xAxBxCxDxE。然后可以将线性预测变量(每个个体一个)

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

(C)

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

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

(d)

现在我们可以生成二进制响应变量。的i响应来自二项式随机变量 Bin(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 
> #---------------------

1
@ocram-可以提供一些直觉来选择参数和选择组件的概率(a部分)吗?这些变化将如何影响锻炼?
d_a_c321 2014年

@dchandler:为便于说明,任意选择了参数和概率。
ocram

2
@ocram-了解 但是,我正在寻找关于什么是好的系数的直觉,以便可以进行更广泛的仿真。例如,如果我想模拟套索回归,我可能有兴趣添加无意义的变量(w /零系数),并查看无意义的变量的数量和有意义变量上非零系数的大小如何影响模拟。
d_a_c321
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.