2017-12-12 32 views
0

저는 20 개의 더하기 열이있는 데이터 프레임을 가지고 있는데,이 각각의 열에 대해 다음과 같은 glm 모델을 만들고 싶습니다. 동일한 테스트 세트로 평가하십시오.데이터 프레임을 반복하고 동일한 테스트 세트에서 평가되는 각 열에 대한 모델을 만듭니다.

# Train-test splitting 
smp_size <- floor(0.70 * nrow(x)) 
index <- sample(seq_len(nrow(x)),size = smp_size) 
train <- x[index, ] 
test <- x[-index, ] 

for (i in 1:22) { 

    names(train)[names(train) == names(train[i])] <- 'variab' 
    names(test)[names(test) == names(test[i])] <- 'variab' 

    mod <- glm(Y ~ variab, family = binomial, data = train) 

    assign(paste0("val", sep = "_", letters[i]), as.numeric(performance(
    prediction(predict(mod, newdata = test, type = "response"),test$Y), 
    measure = "auc")@y.values[[1]])) 
} 

그러나 이것은 작동하지 않으며 "varab"라는 이름을 각 열에 할당하고 각 열에 대해 동일한 모델을 실행합니다. 이 루프는 데이터 프레임의 각 열을 반복하면서 어떻게 반복 할 수 있습니까?

답변

1

다음은 당신을위한 아이디어입니다. 이것이 당신의 필요를 충족 시키길 바랍니다. performance() 또는 prediction() 함수가 어디에서 왔는지 모르기 때문에 예제에서 제거했습니다.

data(iris) 
predictors <- names(iris)[-1] 
response <- names(iris)[1] 

# due to a ill chosen example data: 
iris[,response] <- iris[,response]/max(iris[,response]) 

# sample 
smp_size <- floor(.7*nrow(iris)) 
set.seed(20171212) 
idx <- sample(seq_len(nrow(iris)), size=smp_size) 
train <- iris[idx,] 
test <- iris[-idx,] 


for (i in predictors) { 
    tmp.test <- data.frame(pred=get(i,test), resp=get(response, test)) 
    tmp.train <- data.frame(pred=get(i,train), resp=get(response, train)) 


    mod <- glm(resp ~ pred, family=binomial, data=tmp.train) 

    assign(paste0("val", sep="_", i), data.frame(predicted=as.numeric(predict(mod, newdata=tmp.test, type="response")), actual=get(response,test))) 
    } 

기본적으로 그것은 이미 수행 한 작업입니다. 이미 assign() 함수를 사용하고 있었으며, get()을 보완하고 똑같이 유용하다고 생각합니다. 나는 또한 가능한 경우 숫자 인덱스를 사용하지 않으며 루프를 사용할 때 이름을 반복하여 효과적으로 cat() 메시지를 작성하기 쉽고 간단하기 때문에 지지자입니다.

+0

답변 해 주셔서 감사합니다. "경고 메시지 : 1 : eval (family $ initialize)에서 : 비 정수 # 2 진수 glm에있는 성공! 2 : 'newdata'에 45가 있습니다. 행이 있지만 발견 된 변수에는 105 행이 있습니다. "정상입니까? –

+0

이것은'predict (object = mod, newdata = test, type = "response")'명령에서 나온 것입니다. 실제로 어떤 이유로 예측은 테스트를 사용하지 않고 명시 적 인수가 있더라도 newdata 인수에 대비합니다. 나는 전에 그것을 만난 적이 없지만 그것을 해결하고 내 글을 편집 할 것입니다. – Nate

+0

업데이트 된 답변으로 문제가 해결되고 올바르게 작동합니다. 원래'performance()'또는'prediction()'함수를 사용하지 않았기 때문에 루프의 assign 문이 변경되어보다 나은 결과를 얻을 수 있습니다. 데이터가 실제로는 바이너리 데이터이기 때문에 '정수가 아닌 성공'경고가 표시되는 예제에는 문제가 없어야합니다 (불량한 예제 데이터를 선택했습니다). – Nate