R: сделать модели калибровки PLS из числа n подмножеств и использовать их для прогнозирования различных наборов тестов - PullRequest
1 голос
/ 16 августа 2011

Я пытаюсь применить написанную мной функцию, которая использует пакет 'pls' для создания модели, а затем использует ее для прогнозирования нескольких наборов тестов (в данном случае 9), возвращая R2, ​​RMSEP и смещение прогнозирования каждого тестаустановить для n номера подмножества, выбранного из фрейма данных.функция

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 advice

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): object»белок «не найден» не найден. Белок используется в формуле plsr cpo и находится в наборе данных. Затем я попытался использовать функцию 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): объект« белок »не найден». Любой совет, как с этим справиться и заставить функцию работать, будет высоко оценен.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Мне удалось добиться того, что я хотел, используя это, если есть лучший способ сделать это (я уверен, что должен быть), я стремлюсь учиться. Эта функция выполняет следующую задачу
1.выберите «n» количество подмножеств из кадра данных
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 к подмножествам, созданным с использованием «lapply» вместо цикла «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)

Я смог использовать это, чтобы решить мою проблему, однако, поскольку количество новых данных, которые можно предсказатьМне было только девять, можно было перечислить их, как и я.Если есть более общий способ сделать это, я заинтересован в обучении.

0 голосов
/ 16 августа 2011

Я подозреваю, что проблема возникает сразу при запуске 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, но vector()имеет два аргумента, и вы, кажется, присваиваете r вектор чисел, который вы хотите, чтобы R использовал в качестве аргумента length для vector().

Здесь вы используете объект data.pls иэто еще не существует - и никогда не будет в рамках FOO3() - оно только когда-либо создается в cpo().

Ваш второй цикл выглядит совершенно неверно - вы не назначаете вывод из 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) {

И subset и data не являются хорошими именами, поскольку они являются общими функциями R и аргументами моделирования.

Есть много проблем с вашим кодом.Попробуйте начать с простого и строить оттуда.

...