는 R

2013-07-22 4 views
2

나는 기계 학습 모델을 생성하기 위해 여기에있는 솔루션을 적용하기 위해 노력하고있어에서 목록 벡터를 서브 세트 is.na lapply 사용하고!는 R

은 여기에 더미 데이터의 설정 : 여기

data_pred <- data.frame(x1 = 1:10, x2 = 11:20, x3 = 21:30) 
data_resp <- data.frame(y1 = c(1:5, NA, 7:10), y2 = c(NA, 2, NA, 4:10)) 

측정 R의 각 열에 data_pred에서 예측 모델링 내 for() 루프 방법이었다 caret 패키지를 사용 data_resp에 esponses는 :
# data_pred contains predictors 
# data_resp contains one column per measurement 
# 1 matching row per observation in both data_pred and data_resp 

for (i in 1:ncol(data_resp)) { 

    train(x = data_pred[!is.na(data_resp[, i]), ], 
     y = data_resp[!is.na(data_resp[, i], i], 
     ...) 
} 

지금 나는 많은 장점을 가지고 있다고 생각 lapply와 동일한 기능을 수행 할 노력하고있어. 나는 각각의 응답에 대해 비 NA 사례만으로 모델링 할 수 있도록 !is.na() 표준을 변환하는 데 문제가 있습니다. ,

models <- list(NULL) 
models$rf <- lapply(as.list(data_resp), rf_func) 

NA의를 처리 할 수 ​​randomForest 때문에 잘 작동 :

rf_func <- function(y) { 
    train(x = data_pred, 
     y = y, 
     method = "rf", 
     tuneGrid = data.frame(.mtry = 3:6), 
     nodesize = 3, 
     ntrees = 500, 
     trControl = trControl) } 

이 그런 결과를 저장하고 data_resp에 기능을 적용 할 빈 목록을 작성 : 여기 lapply 방법을 테스트하는 내 초기 기능이었다 하지만 다른 방법으로는 할 수 없기 때문에 각 data_resp 요소와 해당 예측 자의 해당 행을 제거해야합니다.

나는이 성공하지 않고 시도 :

train(x = data_pred_scale[!is.na(y), ], 
     y = y[!is.na(y)], 
     ... } 

나는 또한 내가 lapply에 data.frame 방법 (df[!is.na(df2), ])를 번역하려면 어떻게 y[[!is.na(y)]]

를 시도?

+0

이것은 다소 이상한 설정입니다. 대부분의 사람들은 하나의 y 변수를 가지며 x 변수의 여러 조합을 기반으로 모델을 학습하려고합니다. 당신은 그 반대입니다. –

+0

@HongOoi 나는'x's와 많은 측정 된 응답의 집합'y'를 가지고 있습니다. 나는 각각의'y '를 한 번에 하나씩 예측하기 위해'x'를 사용하고 싶습니다. 화학 공식을 생각해보십시오. 다양한 성분 ('x's)을 가진 화합물을 공식화하고 다양한 온도, 모듈러스, 융점 등의 결과 점도를 모델링하고 싶다고 상상해보십시오. 더 이해가 되나요? * x가 사용하는 *을 알아내는 것은 다른 (중요한) 질문입니다 -하지만 나는 여전히 각각의'y'에 대해'x'의 부분 집합을 모델링 할 필요가 있습니다. 이것은 제가하려고하는 것입니다 위. – Hendy

+0

아무 문제 없어, 나는 단지 호기심이었습니다. –

답변

2

몇 가지 다른 방법이 있습니다. 간단한 방법은 익명 함수입니다 : lapply이 통과 될 것을 시뮬레이션 내 as.list(data_frame)의 단일 요소 주위에 꽤 하구에서

lapply(data_resp, function(x) rf_func(x[!is.na(x)])) 
+0

'data_resp'의 각 요소가 적절하게 부분 집합되도록 보장합니다. 'data_pred'에 대해서'data_pred [y,]'를 사용할 것인가? 이것은 각'data_resp' 컬럼의'N' 값을 ('y '를 취하는 것으로 정의한) 필자의 함수에 넣을 것입니다. 어떻게하면 내 예측 자에서 상응하는 생략 된 행을 제거 할 수 있습니까? – Hendy

0

, 나는가 작동 생각 하는이 함께했다 :

rf_func <- function(y) { 
    train(x = data_pred_scale[!(unlist(lapply(y, is.na))), ], 
     y = y[!(unlist(lapply(y, is.na)))], 
     method = "rf", 
     tuneGrid = data.frame(.mtry = 3:6), 
     nodesize = 3, 
     ntrees = 500, 
     trControl = trControl) } 

models$rf <- lapply(as.list(data_resp), rf_func) 

그것은 제대로 동작 않습니다. 나는 [hackishly]과 같이 각 caret 모델의 trainingData 결과로 설정 비 NA 데이터를 비교 :

nas <- NULL 
for(i in 1:ncol(data_resp)) {nas <- c(nas, length(data_resp[!is.na(data_resp[, i]), i]))} 

model_nas <- NULL 
for(i in 1:length(nas)) {model_nas <- c(model_nas, nrow(models$rf[[i]]$trainingData))} 

identical(nas, model_nas) 
[1] TRUE 

그래서, 그것은 꽤 추한 이런 종류의 작업을 수행하는 가장 좋은/가장 우아한 방법 y[!unlist(lapply(y, is.na)))]입니다 .. .


편집 : @Ricardo Saporta의 답변에 따라, 나는이 가지고 올 수 있었다 (참전 용사에 아마 분명하지만, 나와 함께 곰) :

rf_func <- function(x, y) { 
    train(x = x, 
     y = y, 
     method = "rf", 
     tuneGrid = data.frame(.mtry = 3:6), 
     nodesize = 3, 
     ntrees = 500, 
     trControl = trControl) } 

models$rf <- lapply(data_resp, function (y) { 
    rf_func(data_pred_scale[!is.na(y), ], y[!is.na(y)]) 
    } 
) 

가 있는가 여전히 더 나은 방법인가, 아니면 상당히 괜찮은가? (위의 내 첫 엉망보다 확실히 더 예쁘다.)