После вызова функции 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
- Как исправить ошибка в
sdreport
? - Дополнительный вопрос:
PARAMETER_VECTOR(Beta)
легче кодировать, однако вывод MakeADFun
повторяет бета-версию для каждого ковариата. Есть ли способ сообщить программе использовать вместо нее имя переменной?