2016-09-02 65 views
1

予測関数に入力するオブジェクトタイプを制御する際に問題があります。ここではglmオブジェクトを生成する私の単純化された関数です。glm `predict()`エラー: 'list'クラスのオブジェクトに適用される 'predict'の適用可能なメソッドがありません

私は myFitでやったのと同じ結果を得るために予測する機能を使用できるように、私は fits[,1]で列にアクセスするにはどうすればよい
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" 

+0

であなたのコードを修正することができます '<フィットしてみ - lapply(1:2、fitOneSample、データ、sampleSet)'、そして 'probability2を< - predict(適合[1]、newdata = data) '。 – cryo111

+0

ありがとう@ cryo111。それは完璧に働いた。 –

答えて

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リスト、結果は12 * 3マトリックスのように簡略化されます。

class(fits) 
# "matrix" 

dim(fits) 
# 12 3 

マトリックスインデックスfits[, 1]が有効です。

あなたがstr(fits[, 1])をチェックすると、それはほぼ正常lmオブジェクトのように見えます。しかし、あなたはさらにチェック場合:

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

エム? "lm"クラスはありません!その結果、S3発送方法の意志は、あなたが一般的な機能predict呼び出すときに失敗します。

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

をこれはsapplyは破壊的であることを良い例として見ることができます。私たちは、lapply、または少なくとも、sapply(..., simplify = FALSE)たいlapply

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

結果は、理解するのが容易です。これは長さ3のリストで、各要素はlmオブジェクトです。 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

ありがとうございます。私の主な問題は、ループ中に構造を保持することでした。あなたのご意見は、サプリーが構造を破壊していることを知っていました。私はlapplyを使用するために私の以前の機能を変更しました。 –

関連する問題