Simulation de données pour la régression logistique avec une variable catégorielle


9

J'essayais de créer des données de test pour la régression logistique et j'ai trouvé ce post Comment simuler des données artificielles pour la régression logistique?

C'est une bonne réponse mais elle ne crée que des variables continues. Qu'en est-il d'une variable catégorielle x3 à 5 niveaux (ABCDE) associée à y pour le même exemple que dans le lien?


échantillon (x = c (1, 2, 3), taille = 1, prob = rep (1/3, 3)) génère l'un de "1", "2" ou "3" avec une probabilité égale.
ocram

merci pour votre commentaire, mais comment associer les probabilités ici avec le y du post que j'ai mentionné? Je copie du code à partir de ce post 'code'> set.seed (666)> x1 = rnorm (1000) # quelques variables continues> x2 = rnorm (1000)> z = 1 + 2 * x1 + 3 * x2 # combinaison linéaire avec un biais> pr = 1 / (1 + exp (-z)) # passe par une fonction inv-logit> y = rbinom (1000,1, pr) # variable de réponse bernoulli 'code'
user1301295

Réponses:


13

Le modèle

xB=1xB=0xCxDxExB=xC=xD=xE=0

logit(π)=β0+βBxB+βCxC+βDxD+βExE
β0

Génération de données dans R

(une)

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

Le xvecteur a des ncomposants (un pour chaque individu). Chaque composant est soit "A", "B", "C", "D" ou "E". Chacun de "A", "B", "C", "D" et "E" est également probable.

b)

library(dummies)
dummy(x)

dummy(x)nxAxBxCxDxE

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

(c)

Les probabilités de réussite découlent du modèle logistique:

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

(ré)

iBin(n,p)n=1p= pi[i]

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

Quelques simulations rapides pour vérifier que c'est OK

> #------ 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 - pourrait donner une certaine intuition pour les bons choix de paramètres et le choix des probabilités des composants (partie a)? Comment les modifications apportées à celles-ci affecteront-elles l'exercice?
d_a_c321

@dchandler: Les paramètres et les probabilités ont été choisis arbitrairement, à des fins d'illustration.
ocram

2
@ocram - compris. Cependant, je recherche l'intuition sur ce qui serait de bons coefficients afin de pouvoir exécuter des simulations plus poussées. Par exemple, si je voulais simuler des régressions au lasso, je serais peut-être intéressé à ajouter des variables sans signification (avec des coefficients nuls) et à voir comment le nombre de variables sans signification et l'ampleur des coefficients non nuls sur les variables significatives affectent la simulation.
d_a_c321
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.