如何在TMB .cpp文件中包含更多目标函数?

时间:2017-03-15 03:56:22

标签: c++ r tmb

TMB目标函数似乎在一个保存到dyn.load(dynlib(<name>))文件的功能块中定义。然后,在编译文件之后,通过使用命令.cpp加载来访问每个目标函数。

是否可以在每个// TMB Tutorial but with fixed variance #include <TMB.hpp> // Links in the TMB libraries template<class Type> Type objective_function<Type>::operator() () { DATA_VECTOR(x); // Data vector transmitted from R PARAMETER(mu); // Parameter value transmitted from R Type sigma = 1.0; Type f; // Declare the "objective function" (neg. log. likelihood) f = -sum(dnorm(x,mu,sigma,true)); // Use R-style call to normal density return f; } 文件中存储多个目标函数?例如,以下两个目标函数彼此非常相似,但目前需要保存到不同的文件中:

// TMB Tutorial
#include <TMB.hpp>                                // Links in the TMB libraries

template<class Type>
Type objective_function<Type>::operator() ()
{
    DATA_VECTOR(x);                                 // Data vector transmitted from R
    PARAMETER(mu);                                  // Parameter value transmitted from R
    PARAMETER(sigma);                               //                 

    Type f;                                         // Declare the "objective function" (neg. log. likelihood)
    f = -sum(dnorm(x,mu,sigma,true));               // Use R-style call to normal density

    return f;
}

- (IBAction)segmentValueClick:(id)sender {

    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

    switch (selectedSegment)
    {
        case 0:



            NSLog(@"Requests!");
            _lblText.text=@"Requests";
            break;



        case 1:


            NSLog(@"Friends!");
            _lblText.text=@"Friends";
            break;



        case 2:

           _lblText.text=@"Neighbours";
            NSLog(@"Neighbours!");
            break;

        default:

               NSLog(@"Default case!");
            break;


    }

}

2 个答案:

答案 0 :(得分:2)

&#34;地图&#34; MakeADFun()的参数允许您修改特定值的参数。

在这个例子中,我们只需要编译/加载后一个模板。首先,我们将模板写入文件,编译并加载生成的DLL。

library(TMB)

file_conn <- file('test.cpp')

writeLines("
#include <TMB.hpp>                                

template<class Type>
Type objective_function<Type>::operator() ()
{
    DATA_VECTOR(x);                                 
    PARAMETER(mu);                                  
    PARAMETER(sigma);                               

    Type f;                                         
    f = -sum(dnorm(x,mu,sigma,true));               

    return f;
}
", file_conn)
close(file_conn)

compile('test.cpp')
dyn.load(dynlib('test'))

我们可以使用相同的DLL来适应具有和不具有变化西格玛的模型。

n <- 100
x <- rnorm(n = n, mean = 0, sd = 1) 

f1 <- MakeADFun(data = list(x = x),
               parameters = list(mu = 0, sigma = 1),
               DLL = 'test')

f2 <- MakeADFun(data = list(x = x),
                parameters = list(mu = 0, sigma = 1),
                DLL = 'test',
                map = list(sigma = factor(NA)))

opt1 <- do.call('optim', f1)
opt2 <- do.call('optim', f2)

使用&#34; map&#34;时,指定的参数(在本例中为sigma)固定为&#34;参数&#34;中给出的值。

优化后,我们会进行健全检查 - 应该几乎相同。

> opt1$par
        mu      sigma 
0.08300554 1.07926521 
> opt2$par
        mu 
0.08300712 

开启和关闭随机效果要困难一些。给出here的示例,您可以使用CppAD::Variable()来检查是否减少负对数似然。

对于不相似的目标函数(不是彼此的子集),您可以将DATA_INTEGERDATA_STRING传递到模板中,例如就像他们在glmmTMB here中所做的那样,并根据DATA_*的值选择目标函数。

答案 1 :(得分:0)

我只想说清楚@alexforrence的含义

  

对于不相似的目标函数(不是彼此的子集),您可以将DATA_INTEGER或DATA_STRING传递给模板,例如就像他们在glmmTMB中所做的一样,并根据DATA _ *

的值选择目标函数

事实证明TMB github上有一个code snippet来涵盖这个场景,我在这里重复:

#include <TMB.hpp>

template<class Type>
Type objective_function<Type>::operator() ()
{
  DATA_STRING(model_type);
  if (model_type == "model1") {
    #include "model1.h"
  } else
  if (model_type == "model2") {
    #include "model2.h"
  } else {
    error ("Unknown model type")
  }
  return 0;
}

也就是说,传入一个字符串告诉目标函数选择哪个模型,然后将该函数的文本包含在一个单独的.h文件中。

相关问题