2013-08-14 3 views
0

Я занимался поиском здесь вопросов перед публикацией, и я нашел только один вопрос в этом отношении, но это не относится к моему делу.Оптимизация 2 набора векторов переменной длины

Я загрузил данные для PRD, INJ, tao и lambda с ссылкой ниже, которые должны быть использованы для воспроизведения кода:

PRD

INJ

lambda

tao

код:

PRD=read.csv(file="PRD.csv") 
INJ=read.csv(file="INJ.csv") 
PRD=do.call(cbind, PRD) 
INJ=do.call(cbind, INJ) 
tao=do.call(cbind, read.csv(file="tao.csv",header=FALSE)) 
lambda=do.call(cbind, read.csv(file="lambda.csv",header=FALSE)) 
fn1 <- function (tao,lambda) { 
#perparing i.dash 
    i.dash=matrix(ncol=ncol(INJ), nrow=(nrow(INJ))) 
    for (i in 1:ncol(INJ)){ 
    for (j in 1:nrow (INJ)){ 
     temp=0 
     for (k in 1:j){ 
     temp=(1/tao[i])*exp((k-j)/tao[i])*INJ[k,i]+temp 
     } 

     i.dash[j,i]=temp 
    } 

    #preparing lambdaXi.dash 

    lambda.i=matrix(ncol=ncol(INJ),nrow=nrow(INJ)) 
for (i in 1: ncol(INJ)){ 
    lambda.i[,i]=lambda[i+1]*i.dash[,i] 
} 

#calc. q. hat (I need to add the pp term) 
q.hat=matrix(nrow=nrow(INJ),1) 
    for (i in 1:nrow(INJ)){ 
    q.hat[i,1]=sum(lambda.i[i,1:ncol(INJ)]) 
    target= sum((PRD[,1]-q.hat[,1])^2) 
    } 
    } 
} 

, что я пытаюсь сделать, это свести к минимуму стоимость target за счет оптимизации lambda и tao которых исходные значения будут такими же, как те, загруженными выше. Я использовал optim, но я все равно получаю сообщение об ошибке cannot coerce type 'closure' to vector of type double

Я использовал множество вариантов optim и по-прежнему получаю ту же ошибку.

последний синтаксис я использовал был optim(fn1, tao=tao, lambda=lambda, hessian=T)

Благодаря

ответ

1

Вызывающий форма optim является

optim(par, fn, gr = NULL, ..., 
     method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN", 
      "Brent"), 
     lower = -Inf, upper = Inf, 
     control = list(), hessian = FALSE) 

Итак, вам нужно передать параметры первого, а не функцию. Обратите внимание, что «закрытие» - это еще один термин для «функции», который объясняет сообщение об ошибке: вы передали функцию в качестве первого аргумента, когда optim ожидали начальные значения параметров.

Заметим также, что optim оптимизирует только в течение первого аргумента функции fn, так что вам нужно будет перестроить вашу функцию fn1 поэтому она принимает только одну функцию. Например, это может быть один вектор, где c(n, t1, t2,...,tn, l1, l2, l3, ... lm), где ti - это компоненты tao и li. Компоненты lambda и n сообщают вам, сколько компонентов имеет tao.

+0

Такая же ошибка сохраняется, можете ли вы привести воспроизводимый пример. другой вопрос: как я могу убедиться, что R оптимизирует целевое значение, а не что-то еще в функции? работает ли последняя упомянутая переменная в функции? – Athii

+0

Любой может пролить свет на вопрос выше – Athii

+0

Он оптимизирует только аргумент * first * вашей функции. – seancarmody

Смежные вопросы