TMB目标函数似乎是在一个功能块中定义的,该功能块保存到<name>.cpp文件中。然后,在编译文件之后,通过加载命令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;
}

最佳答案

MakeADFun()的“map”参数允许您将参数固定为特定值。

在这个例子中,我们只需要编译/加载后面的模板。首先,我们将模板写入文件,编译并加载生成的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来适应具有和不具有不同sigma的模型。
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)

使用“map”时,指定的参数(在这种情况下为sigma)固定为“parameters”中给出的值。

优化后,我们进行完整性检查-信号应该几乎相同。
> opt1$par
        mu      sigma
0.08300554 1.07926521
> opt2$par
        mu
0.08300712

打开和关闭随机效果要困难一些。 here就是一个例子,您可以在其中使用CppAD::Variable()来检查是否减少负对数可能性。

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

关于c++ - 如何在TMB .cpp文件中包含更多目标函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42800829/

10-13 05:51