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

问题描述:

我正在使用glm生成模型拟合。我的数据混合了整数变量和分类变量。分类变量采用代码的形式,因此是数据中的整数类型。最初,当我尝试生成模型时,我按原样传递了整数格式的分类变量并获取了模型。我正在查看p值来检查一次是否显着,并注意到一些我并不期望的变量是显着的。R glm为不同类型的相同分类变量生成不同的p值

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

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

  1. R1 >>与分类整型变量
  2. R2 >>与分类因子变量
  3. R3 >>与分类变量转换为二进制

我觉得输出1与分类整型变量不正确(请确认)。但是,输出2和3之间我很困惑考虑哪一个作为

  1. p值是不同的,
  2. 哪一个会更准确
  3. 我能与输出3的p值与输出2?
  4. 如何GLM手柄这样的变量
  5. 希望GLM里面for循环是不是一个问题
  6. 我的数据库大,可我们确实使用data.table GLM?

我粘贴下面我的代码有一些样本数据将被再现

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

为什么动态生成公式? – Koot6133

+0

@ Koot6133,我想更改不同的变量,因此使用公式 – user1412

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

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

+0

您是否想将分类变量转换为二进制会导致错误的结果? glm如何对待他们? – user1412

+0

将分类变量转换为二进制变量时会丢失信息。检查例如你的“账单”变量。它包含1,2和3级别。转换后,将2/3级别更改为一个级别,即0。 – Koot6133