2014-02-05 2 views
1

결과 변수 Y와 Y에 영향을 줄 수있는 20 개의 변수 목록 (예 : X1 ... X20)이 있습니다. 어떤 변수가 Y와 독립적이지 않은지 테스트하고 싶습니다. 이렇게하려면 각 변수와 Y (예 : Y ~ X1, ..., Y ~ X20)에 대해 단일 변수 glm을 실행하고 다음에 대한 우도 비 테스트를 수행하고 싶습니다. 각 모델. 마지막으로 각 모델에 대한 우도 테스트의 결과 P 값을 갖는 테이블을 만들고 싶습니다.여러 변수를 사용하여 단일 변수 GLM 반복

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

잘 모르겠어요.

+0

당신은 접근이 통계적으로 소리가되어 있는지 있습니까? 20 개의 모델을 만드는 것은 나에게 나쁜 생각처럼 보입니다. 아마도 CrossValidated가 물어볼 적절한 곳입니다. – nico

+0

@nico Applied Logistic Regression (Hosmer and Lemeshow, 2000)에서 권장하는 변수 선택 방법을 따르고 있습니다. 내 응답 변수가 이진 로지스틱 회귀이기 때문에 변수가 응답과 중요한 관계가 있는지 여부를 평가하는 가장 좋은 방법입니다. – see24

+0

OK, 내 코멘트를 잊어 버려. :) ​​ – 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) 

이것은 맞는 모델 목록을 제공합니다. 그런 다음 fitted.models의 apply 함수를 사용하여 추가 테스트를 실행할 수 있습니다.

+0

감사합니다 @ 폴 Staab 그 첫 번째 부분에 대해 정말 잘 작동하지만 lapply를 사용하여 각 모델에 대한 lrtest를 수행하는 데 어려움을 겪고 아직도 fitted.models. > lrtglms <-lapply (fitted.models, FUN = lrtest) 하지만이 오류가 발생합니다 : eval (expr, envir, enclos) 오류 : "FUN"함수를 찾을 수 없습니다. – see24

+0

lmtest 라이브러리가로드 되었습니까 (예 : library (lmtest))? –

+0

예 lmtest 라이브러리가로드되었습니다. 나는 시도했다 : lrtglms <--lapply (fitted.models, function (x) lrtest (x, data = data)) 그리고 update.default (objects [[i]], subset = logical (0)) 오류 : 에는 호출 구성 요소가있는 객체가 필요합니다. 경고 메시지 : modelUpdate (objects [[i-1]], 객체 [[i]]) : 원래 모델은 클래스 "glm"이었고 업데이트 된 모델은 클래스 " data.frame "그래서 실제로 문제는 실제로 fitted.models <- lapply (formula, glm, data = example.data)의 출력이 glm 객체 목록 대신 목록 목록이라는 것입니다. – see24

0

폴 (Paul)이 최소한의 예를 제시하면 도움이된다고 말했지만, 나는 이것이 당신이 원하는대로한다고 생각합니다. 비교를 위해

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 
관련 문제