首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MakeADFun错误(.‘'data’必须是调用‘`TMB::sdreport()’之后的列表?

MakeADFun错误(.‘'data’必须是调用‘`TMB::sdreport()’之后的列表?
EN

Stack Overflow用户
提问于 2020-04-14 12:50:59
回答 1查看 136关注 0票数 0

调用sdreport函数后,会得到一个意外的错误:Error in MakeADFun(obj$env$data, obj$env$parameters, type = "ADFun", ADreport = TRUE, : 'data' must be a list,这很奇怪,因为我将数据作为list传递:

simplex_reg_full.cpp:

代码语言:javascript
复制
// 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码

代码语言:javascript
复制
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的输出对于每一个协变量都会重复Beta。是否有方法通知程序使用变量的名称?
EN

回答 1

Stack Overflow用户

发布于 2020-05-11 21:03:32

对于问题1:有必要为对象调用sdreport,也不必调用优化的函数:

sdreport(obj)工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61208154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档