2017-10-05 6 views
0

Je génère un ajustement de modèle en utilisant glm. Mes données ont un mélange de variables entières et de variables catégorielles. Les variables catégoriques sont sous la forme de codes et donc de type entier dans les données. Au départ, lorsque j'ai essayé de générer le modèle, j'ai transmis les variables catégorielles au format entier tel qu'il est et j'ai obtenu le modèle. Je regardais les p-valeurs pour vérifier la fois qui sont significatives et remarqué que peu de variables étaient significatives que je ne m'attendais pas.R glm générant différentes valeurs p pour les mêmes variables catégorielles de type différent

Ceci est lorsqu'il est réalisé que peut-être les variables catégorielles dans formulaire entier créent un problème. Donc, comme le code 3 pourrait avoir une plus grande importance que le code 1 (pas sûr sur ce point et ce serait génial si quelqu'un peut confirmer cela). En faisant quelques recherches, j'ai trouvé que nous pouvons convertir la variable entière catégorique en facteur. J'ai fait la même chose et j'ai re-généré le modèle.

J'ai également vu quelques postes où il a été mentionné de convertir en binaire, donc je l'ai fait nous bien. Alors maintenant, j'ai 3 résultats -

  1. r1 >> avec des variables entières catégoriques
  2. >> avec des variables r2 facteur catégoriques
  3. r3 >> avec variables qualitatives converties en binaire

Je me sens cette sortie 1 avec des variables entières catégorielles est incorrecte (Veuillez confirmer). Mais entre la sortie 2 et 3 je suis confus que l'on à considérer comme

  1. valeurs p sont différentes,
  2. que l'on serait plus précis
  3. puis-je lié les valeurs p de sortie 3 avec sortie 2?
  4. Comment poignée de GLM variables telles
  5. espoir GLM dans une boucle est pas un problème
  6. Ma base de données est grande, pouvons-nous faire GLM à l'aide data.table?

Je suis coller en dessous de mon code avec quelques exemples de données à reproduire

library("plyr") 
library("foreign") 
library("data.table") 

#####Generating sample data 

set.seed(1200) 
id <- 1:100 
bill <- sample(1:3,100,replace = T) 
nos <- sample(1:40,100,replace = T) 
stru <- sample(1:4,100,replace = T) 
type <- sample(1:7,100,replace = T) 
value <- sample(100:1000,100,replace = T) 

df1 <- data.frame(id,bill,nos,stru,type,value) 

var1 <- c("bill","nos","stru") 

options(scipen = 999) 
r1 <- data.frame() 

for(type1 in unique(df1$type)){ 
    for(var in var1){ 
    # dynamically generate formula 
    fmla <- as.formula(paste0("value ~ ", var)) 

    # fit glm model 
    fit <- glm(fmla, data=df1[df1$type == type1,],family='quasipoisson') 
    p.value <- coef(summary(fit))[8] 

    cfit <- coef(summary(fit)) 
    # create data frame 
    df2 <- data.frame(var = var, type = type1, basket="value",p.value = cfit[8],stringsAsFactors = F) 
    r1 <- rbind(r1, df2) 
    } 
} 

##### converting the categorical numeric variables to factor variables 

df1$bill_f <- as.factor(bill) 
df1$stru_f <- as.factor(stru) 

var1 <- c("bill_f","nos","stru_f") 

r2 <- data.frame() 

for(type1 in unique(df1$type)){ 
    for(var in var1){ 
    # dynamically generate formula 
    fmla <- as.formula(paste0("value ~ ", var)) 

    # fit glm model 
    fit <- glm(fmla, data=df1[df1$type == type1,],family='quasipoisson') 
    p.value <- coef(summary(fit))[8] 

    cfit <- coef(summary(fit)) 
    # create data frame 
    df2 <- data.frame(var = var, type = type1, basket="value",p.value = cfit[8],stringsAsFactors = F) 
    r2 <- rbind(r2, df2) 
    } 
} 

#####converting the categorical numeric variables to binary format (1/0) 

df1$bill_1 <- ifelse(df1$bill == 1,1,0) 
df1$bill_2 <- ifelse(df1$bill == 2,1,0) 
df1$bill_3 <- ifelse(df1$bill == 3,1,0) 

df1$stru_1 <- ifelse(df1$stru == 1,1,0) 
df1$stru_2 <- ifelse(df1$stru == 2,1,0) 
df1$stru_3 <- ifelse(df1$stru == 3,1,0) 
df1$stru_4 <- ifelse(df1$stru == 4,1,0) 

var1 <- c("bill_1","bill_2","bill_3","nos","stru_1","stru_2","stru_3") 

r3 <- data.frame() 

for(type1 in unique(df1$type)){ 
    for(var in var1){ 
    # dynamically generate formula 
    fmla <- as.formula(paste0("value ~ ", var)) 

    # fit glm model 
    fit <- glm(fmla, data=df1[df1$type == type1,],family='quasipoisson') 
    p.value <- coef(summary(fit))[8] 

    cfit <- coef(summary(fit)) 
    # create data frame 
    df2 <- data.frame(var = var, type = type1, basket="value",p.value = cfit[8],stringsAsFactors = F) 
    r3 <- rbind(r3, df2) 
    } 
} 
+0

Pourquoi générez-vous dynamiquement la formule? – Koot6133

+0

@ Koot6133, je veux changer pour différentes variables et donc l'utilisation de la formule – user1412

Répondre

0

Votre sentiment est surtout correct. Pour un GLM, vous devez faire la distinction entre les variables continues et les variables discrètes (catégoriques).

Les variables binaires sont des variables qui contiennent seulement 2 niveaux, par exemple 0 et 1. Puisque vous n'avez que des variables avec 2+ niveaux, vous devez utiliser la fonction factor().

+0

Voulez-vous dire que la conversion des variables catégoriques en binaire donnerait un résultat incorrect? comment les traite-t-il? – user1412

+0

Vous perdez des informations lorsque vous convertissez une variable catégorielle en variable binaire. Vérifiez par exemple votre variable "facture". Il contient des niveaux 1,2 et 3. Après la conversion il change les niveaux 2/3 à un seul niveau, à savoir 0. – Koot6133