2014-02-05 39 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