2014-02-05 41 views
1

我有一个结果变量,比如Y和一个可能影响Y的变量列表(如X1 ... X20)。我想测试哪些变量不是独立于Y.为此,我想为每个变量和Y(即Y〜X1,...,Y〜X20)运行一个单变量glm,然后进行似然比检验每个型号。最后,我想创建一个表格,其中包含来自每个模型可能性测试的结果P值。重复具有多个不同变量的单变量GLM

从我所看到的lapply函数和分割函数可能对此有用,但我并不真正了解它们如何在我见过的示例中工作。

这是我最初试图:

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

我不知道这是否是一个好办法,但。

+0

确定的方法是可靠的统计?生成20个模型对我来说似乎是一个坏主意...也许CrossValidated是正确的问题。 – nico

+0

@nico我遵循应用逻辑回归中推荐的变量选择方法(Hosmer和Lemeshow,2000)。因为我的回答变量是二元logistic回归是评估变量与回应是否有显着关系的最好方法。 – see24

+0

好的,然后忘记我的评论:) – nico

回答

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函数来执行进一步的测试。

+0

感谢@Paul Staab,第一部分工作得很好,但我仍然无法使用lapply来为fit.models中生成的每个模型执行lrtest。这是我做的:> lrtglms <-lapply(fitted.models,FUN = lrtest) 但我得到这个错误:eval(expr,envir,enclos)中的错误:无法找到函数“FUN”任何想法? – see24

+0

您是否已加载lmtest库(例如库(lmtest))? –

+0

是的,我确实已经加载了lmtest库。我尝试了:lrtglms <-lapply(fitted.models,function(x)lrtest(x,data = data))并得到:错误update.default(objects [[i]],subset = logical(0)): 需要一个带有呼叫组件的对象另外:警告信息: 在modelUpdate(objects [[i - 1]],objects [[i]]): 原始模型是class“glm”,更新模型是class“ data.frame“因此,我认为问题实际上是来自fitted.models < - lapply(公式,glm,data = example.data)的输出是列表列表,而不是glm对象列表。 – see24

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