R glm为不同类型的相同分类变量生成不同的p值

时间:2017-10-05 12:08:50

标签: r for-loop model data.table glm

我使用glm生成模型拟合。我的数据包含整数变量和分类变量。分类变量采用代码形式,因此数据中包含整数类型。最初,当我尝试生成模型时,我按照整数格式传递分类变量并获得模型。我正在查看p值来检查一次是重要的,并注意到很少的变量是重要的,我没想到。

这是在意识到可能是整数形式的分类变量正在创建一些问题。因此,代码3可能比代码1更重要(对此不确定,如果有人可以确认这个会很好)。在进行一些研究时,我发现我们可以将分类整数变量转换为 factor 。我做了同样的事情并重新生成了模型。

我还看到了一些提到转换为二进制的帖子,所以我做得很好。所以现在我有3个结果 -

  1. r1>>使用分类整数变量
  2. r2>>分类因子变量
  3. r3>>分类变量转换为二进制
  4. 我觉得带有分类整数变量的输出1不正确(请确认)。但是在输出2和3之间我很困惑哪一个要考虑为

    1. p值不同,
    2. 哪一个更准确
    3. 我可以将输出3的p值与输出2相关联吗?
    4. glm如何处理此类变量
    5. 希望glm在for循环中不是问题
    6. 我的数据库很大,我们可以使用data.table吗?
    7. 我在我的代码下面粘贴了一些要复制的样本数据

      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)
        }
      }
      

1 个答案:

答案 0 :(得分:0)

你的感觉大多是正确的。对于GLM,您应该区分连续变量和离散(分类)变量。

二进制变量是仅包含2个级别的变量,例如0和1。 由于您只有2个级别的变量,因此应使用factor()函数。