用几个不同的变量重复单变量GLM

时间:2014-02-05 21:24:03

标签: r glm

我有一个结果变量,比如Y和一个可能影响Y的20个变量的列表(比如X1 ... X20)。我想测试哪些变量不与Y无关。为了做到这一点,我想为每个变量和Y运行一个单变量glm(即Y~X1,...,Y~X20),然后进行似然比检验每个型号。最后,我想创建一个表,其中包含每个模型的似然检验得到的P值。

从我所看到的lapply函数和split函数可能对此有用,但我真的不明白它们在我看过的例子中是如何工作的。

这是我最初尝试过的:

> VarNames<-c(names(data[30:47]))
> glms<-glm(intBT~VarNames,family=binomial(logit))
Error in model.frame.default(formula = intBT ~ VarNames, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'VarNames')

我不确定这是否是一个好方法。

2 个答案:

答案 0 :(得分:1)

如果您提供minimal example,则更容易回答您的问题。

一种方法 - 但肯定不是最美丽的 - 是使用粘贴来创建公式作为字符串的向量,然后使用lapply。该代码可能如下所示:

example.data <- data.frame(intBT=1:10, bli=1:10, bla=1:10, blub=1:10)
var.names <- c('bli', 'bla', 'blub')

formulas <- paste('intBT ~', var.names)
fitted.models <- lapply(formulas, glm, data=example.data)

这给出了拟合模型的列表。然后,您可以使用fits.models上的apply函数执行进一步的测试。

答案 1 :(得分:0)

就像保罗所说,如果你提供一个最小的例子,它确实有帮助,但我认为这可以做你想要的。

set.seed(123)
N <- 100
num_vars <- 5
df <- data.frame(lapply(1:num_vars, function(i) i = rnorm(N)))
names(df) <- c(paste0(rep("X",5), 1:num_vars ))
e <- rnorm(N)
y <- as.numeric((df$X1 + df$X2 + e) > 0.5)

pvalues  <- vector(mode = "list")
singlevar  <- function(var, y, df){
  model <- as.formula(paste0("y ~ ", var))
  pvalues[var] <- coef(summary(glm(model, family = "binomial", data = df)))[var,4]
}

sapply(colnames(df), singlevar, y, df)
          X1           X2           X3           X4           X5 
1.477199e-04 4.193461e-05 8.885365e-01 9.064953e-01 9.702645e-01 

进行比较:

Call:
glm(formula = y ~ X2, family = "binomial", data = df)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0674  -0.8211  -0.5296   0.9218   2.5463  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.5591     0.2375  -2.354   0.0186 *  
X2            1.2871     0.3142   4.097 4.19e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 130.68  on 99  degrees of freedom
Residual deviance: 106.24  on 98  degrees of freedom
AIC: 110.24

Number of Fisher Scoring iterations: 4