Ошибка в MakeADFun (... 'data' должна быть списком после вызова `TMB :: sdreport ()`? - PullRequest
0 голосов
/ 14 апреля 2020

После вызова функции sdreport я получаю неожиданную ошибку: Error in MakeADFun(obj$env$data, obj$env$parameters, type = "ADFun", ADreport = TRUE, : 'data' must be a list, что странно, потому что я передаю данные в виде списка:

simplex_reg_full. cpp:

// Simplex Regression
#include <TMB.hpp>
template<class Type>
Type objective_function<Type>::operator() ()
{
  // Data provided from user
  DATA_VECTOR(Y);
  DATA_MATRIX(X);
  // Parameter of the model
  PARAMETER_VECTOR(Beta);
  PARAMETER(log_sd);
  // Variables used in the programming;
  int n = Y.size();
  vector<Type> eta(n); 
  vector<Type> d0(n); 
  vector<Type> mu(n); 
  Type pi = 3.141593;
  Type nll = 0.0;
  // Linear predictor
  eta = X*Beta;
  // logit is link function, and inv.logit is its inverse and is being applied
  mu = 1/(1+exp(-eta));
  for( int i=0; i<n; i++){
    d0(i) = pow((Y(i)-mu(i)),2)/(Y(i)*(1-Y(i))*pow(mu(i),2)*pow((1-mu(i)),2));
    nll -= - 0.5*log(2*pi) - 0.5*log(exp(log_sd))  - (3/2)*log(Y(i)*(1-Y(i))) - (1/(2*exp(log_sd)))*d0(i);
  }
  return nll;
}

Связь с набором данных

Код R :

compile('simplex_reg_full.cpp')
dyn.load(dynlib("simplex_reg_full"))
dados <- read.table("simplex.txt",header=TRUE)
data <- list(Y = dados$y,
             X = cbind(1, dados[, "MEDIA"]))
obj <- MakeADFun(data = data, 
                 parameters = list(Beta = c(0,0), log_sd = 2),
                 DLL = "simplex_reg_full",
                 inner.method = "newton", # Laplace
                 method = "BFGS",
                 hessian = T,
                 smartsearch=T)
opt <- do.call("optim", obj)
rep <- sdreport(opt)
Error in MakeADFun(obj$env$data, obj$env$parameters, type = "ADFun", ADreport = TRUE,  : 
  'data' must be a list
  1. Как исправить ошибка в sdreport?
  2. Дополнительный вопрос: PARAMETER_VECTOR(Beta) легче кодировать, однако вывод MakeADFun повторяет бета-версию для каждого ковариата. Есть ли способ сообщить программе использовать вместо нее имя переменной?
...