2016-09-02 9 views
1

예측 함수에 입력되는 객체 유형을 제어하는 ​​데 문제가 있습니다. 여기에 glm 객체를 생성 내 단순화 된 기능입니다.glm`predict()`오류 : "list"클래스의 객체에 적용 할 수있는 'predict'의 적용 가능한 메소드가 없습니다.

fitOneSample <- function(x,data,sampleSet) 
{ 
    #how big of a set are we going to analyze? Pick a number between 5,000 & 30,000, then select that many rows to study 
    sampleIndices <- 1:5000 

    #now randomly pick which columns to study 
    colIndices <- 1:10 

    xnames <- paste(names(data[,colIndices]),sep = "") 
    formula <- as.formula(paste("target ~ ", paste(xnames,collapse = "+"))) 
    glm(formula,family=binomial(link=logit),data[sampleIndices,]) 
} 

myFit <- fitOneSample(1,data,sampleSet) 
fits <- sapply(1:2,fitOneSample,data,sampleSet) 
all.equal(myFit,fits[,1]) #different object types 

#this works 
probability <- predict(myFit,newdata = data) 

#this doesn't 
probability2 <- predict(fits[,1],newdata = data) 
# Error in UseMethod("predict") : 
# no applicable method for 'predict' applied to an object of class "list" 

어떻게 내가 myFit와 함께했던 동일한 결과를 얻을 수있는 예측 기능을 사용할 수 있도록 fits[,1]에 열을 액세스합니까?

+0

하여 코드를 수정할 수 있습니다 맞는 <'시도 - lapply (1 : 2, fitOneSample, 데이터, sampleSet)'다음'probability2을 < - 예측 (맞는 [[1]], newdata = 데이터)'. cryo111 @ – cryo111

+0

감사합니다. 그것은 완벽하게 작동했습니다. –

답변

1

이제 상황을 복구 할 수 있다고 생각합니다.

fits <- sapply(names(trees), 
       function (y) do.call(lm, list(formula = paste0(y, " ~ ."), data = trees))) 

이 3 개 개의 선형 모델 피팅, 예를 들어 데이터 세트 trees 내장 사용합니다 : 우리가 sapply을 사용했기 때문에

Girth ~ Height + Volume 
Height ~ Girth + Volume 
Volume ~ Height + Girth 

을하고, 각 반복은 동일한 lm 개체를 반환하거나, 길이 12

class(fits) 
# "matrix" 

dim(fits) 
# 12 3 

행렬 인덱스,132,888리스트는 결과가 12 * 3 매트릭스 단순화 될3210이 유효합니다. 당신이 str(fits[, 1])을 선택하면

, 그것은 거의 정상 lm 객체처럼 보인다. 그러나 추가로 확인하는 경우 :

class(fits[, 1]) 
# "list" 

Em? "영화"수업이 없습니다!

predict(x) 
#Error in UseMethod("predict") : 
# no applicable method for 'predict' applied to an object of class "list" 

sapply을 파괴하는 좋은 사례로 볼 수있다 : 당신이 일반적인 기능 predict 전화 할 때 그 결과S3 발송 방법의 의지가 실패합니다. 우리는 lapply을 원하는, 또는 적어도, sapply(..., simplify = FALSE) : lapply

fits <- lapply(names(trees), 
       function (y) do.call(lm, list(formula = paste0(y, " ~ ."), data = trees))) 

결과는 이해하기가 쉽습니다. 각 요소는 lm 목적은 길이 3 인리스트이다. 우리는 fits[[1]]를 통해 첫 번째 모델에 액세스 할 수 있습니다. 이제 모든 것이 작동합니다

class(fits[[1]]) 
# "lm" 

predict(fits[[1]]) 
#  1   2   3   4   5   6   7   8 
# 9.642878 9.870295 9.941744 10.742507 10.801587 10.886282 10.859264 10.957380 
#  9  10  11  12  13  14  15  16 
#11.588754 11.289186 11.946525 11.458400 11.536472 11.835338 11.133042 11.783583 
#  17  18  19  20  21  22  23  24 
#13.547349 12.252715 12.603162 12.765403 14.002360 13.364889 14.535617 15.016944 
#  25  26  27  28  29  30  31 
#15.628799 17.945166 17.958236 18.556671 17.229448 17.131858 21.888147 

당신은

fits <- lapply(1:2,fitOneSample,data,sampleSet) 
probability2 <-predict(fits[[1]],newdata = data) 
+0

감사합니다. 내 주요 문제는 루프 동안 구조를 보존했다. 알고 좋은 - 귀하의 의견은 나에게 그 sapply이 구조를 파괴 깨닫게했다. lapply를 사용하기 위해 이전 함수를 수정했습니다. –