1

「pls」パッケージを使用してモデルを作成し、それを使用していくつかのテスト セット (この場合は 9) を予測し、n の各テスト セットの R2、RMSEP および予測バイアスを返す関数を適用しようとしています。データ フレームから選択されたサブセットの数。関数は

cpo<-function(data,newdata1,newdata2,newdata3,newdata4,newdata5,newdata6,newdata7,newdata8,newdata9){
              data.pls<-plsr(protein~.,8,data=data,validation="LOO")#making a pls model
              newdata1.pred<-predict(data.pls,8,newdata=newdata1)   #using the model to predict test sets
              newdata2.pred<-predict(data.pls,8,newdata=newdata2)
              newdata3.pred<-predict(data.pls,8,newdata=newdata3)
              newdata4.pred<-predict(data.pls,8,newdata=newdata4)
              newdata5.pred<-predict(data.pls,8,newdata=newdata5)
              newdata6.pred<-predict(data.pls,8,newdata=newdata6)
              newdata7.pred<-predict(data.pls,8,newdata=newdata7)
              newdata8.pred<-predict(data.pls,8,newdata=newdata8)
              newdata9.pred<-predict(data.pls,8,newdata=newdata9)
              pred.bias1<-mean(newdata1.pred-newdata1[742])         #calculating the prediction bias
              pred.bias2<-mean(newdata2.pred-newdata2[742])
              pred.bias3<-mean(newdata3.pred-newdata3[742])        #[742] reference values in column742
              pred.bias4<-mean(newdata4.pred-newdata4[742])
              pred.bias5<-mean(newdata5.pred-newdata5[742])
              pred.bias6<-mean(newdata6.pred-newdata6[742])
              pred.bias7<-mean(newdata7.pred-newdata7[742])
              pred.bias8<-mean(newdata8.pred-newdata8[742])
              pred.bias9<-mean(newdata9.pred-newdata9[742])
            r<-c(R2(data.pls,"train"),RMSEP(data.pls,"train"),pred.bias1,
                 pred.bias2,pred.bias3,pred.bias4,pred.bias5,pred.bias6,
                 pred.bias7,pred.bias8,pred.bias9)
          return(r)
}

n個のサブセットを選択する(私の質問[1]からの回答に基づく:異なる行間隔を取り、すべてのサブセット に関数を適用し、試した各サブセットにcpo関数を適用することにより、いくつかのサブセットを選択します

@Gavinのアドバイスに基づいて編集

FO03 <- function(data, nSubsets, nSkip){
  outList <- vector("list", 11)
  names(outList) <- c("R2train","RMSEPtrain", paste("bias", 1:9, sep = ""))
  sub <- vector("list", length = nSubsets)  # sub is the n number subsets created by selecting rows
  names(sub) <- c( paste("sub", 1:nSubsets, sep = ""))

 totRow <- nrow(data)

  for (i in seq_len(nSubsets)) {
    rowsToGrab <- seq(i, totRow, nSkip)
      sub[[i]] <- data[rowsToGrab ,] 
  }                                                           


for(i in sub) {                                         #for every subset in sub i want to apply cpo
    outList[[i]] <- cpo(data=sub,newdata1=gag11p,newdata2=gag12p,newdata3=gag13p,  
       newdata4=gag21p,newdata5=gag22p,newdata6=gag23p,                   
       newdata7=gag31p,newdata8=gag32p,newdata9=gag33p) #new data are test sets loaded in the workspace
      }
    return(outlist)
 }

FOO3(GAGp,10,10)

これを試してみると、「eval(expr、envir、enclos)のエラー:オブジェクト「タンパク質」が見つかりません」というメッセージが表示され続けます。タンパク質は cpo の plsr 式で使用され、データセットに含まれています。次に、以下に示すように plsr 関数を直接使用しようとしました

FOO4 <- function(data, nSubsets, nSkip){
outList <- vector("list", 11)
  names(outList) <- c("R2train","RMSEPtrain", paste("bias", 1:9, sep = ""))
  sub <- vector("list", length = nSubsets)
  names(sub) <- c( paste("sub", 1:nSubsets, sep = ""))

  totRow <- nrow(data)

  for (i in seq_len(nSubsets)) {
    rowsToGrab <- seq(i, totRow, nSkip)
      sub[[i]] <- data[rowsToGrab ,] 
  }

  cal<-vector("list", length=nSubsets)  #for each subset in sub make a pls model for protein
  names(cal)<-c(paste("cal",1:nSubsets, sep=""))
  for(i in sub) {
       cal[[i]] <- plsr(protein~.,8,data=sub,validation="LOO")
       }
    return(outlist) # return is just used to end script and check if error still occurs
 }
FOO4(gagpm,10,10)

これを試してみると、同じエラー「eval(expr、envir、enclos)のエラー:オブジェクト「タンパク質」が見つかりません」が表示されます。これに対処し、関数を機能させる方法についてのアドバイスは大歓迎です。

4

2 に答える 2

0

問題はの開始直後にあると思われますFOO3()

FOO3 <- function(data, nSubsets, nSkip) {
 outList <- vector("list", r <- c(R2(data.pls,"train"), RMSEP(data.pls,"train"), 
                   pred.bias1, pred.bias2, pred.bias3, pred.bias4, pred.bias5,
                   pred.bias6, pred.bias7, pred.bias8, pred.bias9))

を作成するときにをしようとしているのかわかりませんがoutList、引数が 2 つあり、R が の引数として使用する数値のベクトルにvector()代入しているようです。rlengthvector()

ここでオブジェクトを使用していますがdata.pls、これはまだ存在せず、フレーム内には存在しません。FOO3()これは でのみ作成されcpo()ます。

2 番目のループは完全に間違っているように見えます。出力を何にも割り当てていませんcpo()。私はあなたが望んでいたと思います:

outList <- vector("list", 11)
names(outList) <- c("R2train","RMSEPtrain", paste("bias", 1:9, sep = ""))
....
for(i in subset) {
    outList[[i]] <- cpo(....)
}
return(outList)

しかし、それは何があるかなどに依存しsubsetます。また、このループの構文も正しくありません。あなたが持っている

for(i in(subset)) {

いつあるべきか

for(i in subset) {

そしてsubsetanddataは一般的な R 関数とモデリング引数であるため、あまり良い名前ではありません。

コードには多くの問題があります。シンプルに始めて、そこから構築してみてください。

于 2011-08-16T11:19:14.367 に答える
0

私はこれを使用して私が望んでいたことを達成することができました.それを行うためのより良い方法があれば(きっとあるはずです)、私は学びたいと思っています.この関数は次のタスクを実行し
ます.データフレームからのサブセット
2. 作成されたサブセットごとに、plsr モデルが作成され
ます 3. 各 plsr モデルを使用して、9 つのテスト セットを予測します
4. 予測ごとに、予測バイアスが計算されます

far5<- function(data, nSubsets, nSkip){
   sub <- vector("list", length = nSubsets)
   names(sub) <- c( paste("sub", 1:nSubsets, sep = ""))                   
   totRow <- nrow(data)
   for (i in seq_len(nSubsets)) {
     rowsToGrab <- seq(i, totRow, nSkip)
       sub[[i]] <- data[rowsToGrab ,]}       #sub is the subsets created
  mop<- lapply(sub,cpr2)                     #assigning output from cpr to mop
   names(mop)<-c(paste("mop", mop, sep="")) 
  return(names(mop))
 }
call:  far5(data,nSubsets, nSkip)) 

最初の部分 - サブセットの選択は、私の質問への回答に基づいています。異なる行間隔を使用して複数のサブセットを選択し、すべてのサブセット に関数を適用します。次に、関数 cpr2 を、"以前に行われた for' ループ. cpr2 は cpo の変更であり、データのみが提供され、予測される新しいデータは、以下に示すように関数で直接使用されます.

cpr2<-function(data){ 
  data.pls<-plsr(protein~.,8,data=data,validation="LOO") #make plsr model       
  gag11p.pred<-predict(data.pls,8,newdata=gag11p)  #predict each test set 
  gag12p.pred<-predict(data.pls,8,newdata=gag12p)
  gag13p.pred<-predict(data.pls,8,newdata=gag13p)
  gag21p.pred<-predict(data.pls,8,newdata=gag21p)
  gag22p.pred<-predict(data.pls,8,newdata=gag22p)            
  gag23p.pred<-predict(data.pls,8,newdata=gag23p)
  gag31p.pred<-predict(data.pls,8,newdata=gag31p)
  gag32p.pred<-predict(data.pls,8,newdata=gag32p)
  gag33p.pred<-predict(data.pls,8,newdata=gag33p)                        
  pred.bias1<-mean(gag11p.pred-gag11p[742])     #calculate prediction bias      
  pred.bias2<-mean(gag12p.pred-gag12p[742])
  pred.bias3<-mean(gag13p.pred-gag13p[742])         
  pred.bias4<-mean(gag21p.pred-gag21p[742])
  pred.bias5<-mean(gag22p.pred-gag22p[742])
  pred.bias6<-mean(gag23p.pred-gag23p[742])
  pred.bias7<-mean(gag31p.pred-gag31p[742])
  pred.bias8<-mean(gag32p.pred-gag32p[742])
  pred.bias9<-mean(gag33p.pred-gag33p[742])            
r<-signif(c(pred.bias1,pred.bias2,pred.bias3,pred.bias4,pred.bias5,
      pred.bias6,pred.bias7,pred.bias8,pred.bias9),2)            
  out<-c(R2(data.pls,"train",ncomp=8),RMSEP(data.pls,"train",ncomp=8),r)
 return(out)          
}                 #signif use to return 2 decimal place for prediction bias

call:cpr2(data)

これを使用して問題を解決することができましたが、予測される新しいデータの量は 9 つだけだったので、それらをリストすることができました。これを行うためのより一般的な方法があれば、私は学ぶことに興味があります。

于 2011-09-12T05:35:06.580 に答える