Simulazione di dati per la regressione logistica con una variabile categoriale


9

Stavo cercando di creare alcuni dati di test per la regressione logistica e ho trovato questo post Come simulare i dati artificiali per la regressione logistica?

È una bella risposta ma crea solo variabili continue. Che dire di una variabile categoriale x3 con 5 livelli (ABCDE) associata a y per lo stesso esempio del collegamento?


sample (x = c (1, 2, 3), size = 1, prob = rep (1/3, 3)) genera uno di "1", "2" o "3" con uguale probabilità.
Ocram,

grazie per il tuo commento, ma come posso associare le probabilità qui alla y del post che ho citato? Copio del codice da quel post 'codice'> set.seed (666)> x1 = rnorm (1000) # alcune variabili continue> x2 = rnorm (1000)> z = 1 + 2 * x1 + 3 * x2 # combinazione lineare con un bias> pr = 1 / (1 + exp (-z)) # passa attraverso una funzione inv-logit> y = rbinom (1000,1, pr) # variabile di risposta 'codice'
bernoulli

Risposte:


13

Il modello

Sia se si ha la categoria "B" e x B = 0 altrimenti. Definisce x C , x D e x E simili. Se x B = x C = x D = x E = 0 , allora abbiamo la categoria "A" (cioè "A" è il livello di riferimento). Il modello può quindi essere scritto comeXB=1XB=0XCXDXEXB=XC=XD=XE=0

con β 0 un'intercetta.

logit(π)=β0+βBXB+βCXC+βDXD+βEXE
β0

Generazione di dati in R

(un)

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

Il xvettore ha ncomponenti (uno per ogni individuo). Ogni componente è "A", "B", "C", "D" o "E". Ognuno di "A", "B", "C", "D" ed "E" è altrettanto probabile.

(B)

library(dummies)
dummy(x)

dummy(x)nXUNXBXCXDXE

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

(C)

Le probabilità di successo derivano dal modello logistico:

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

(D)

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

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

Alcune simulazioni rapide per verificare che sia 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 - potrebbe dare qualche intuizione per buone scelte di parametri e scelta delle probabilità dei componenti (parte a)? In che modo le modifiche a questi influenzerebbero l'esercizio?
d_a_c321

@dchandler: i parametri e le probabilità sono stati scelti arbitrariamente, a scopo illustrativo.
Ocram,

2
@ocram: capito. Tuttavia, sto cercando un'intuizione su quali sarebbero i buoni coefficienti in modo da poter eseguire simulazioni più estese. Ad esempio, se volessi simulare le regressioni del lazo, potrei essere interessato ad aggiungere variabili insignificanti (con coefficienti zero) e vedere come il # di variabili insignificanti e l'entità dei coefficienti diversi da zero su variabili significative influenzano la simulazione.
d_a_c321
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.