如何循环数据框中的所有值作为 maxLik 中的起始值

How to loop all values in a dataframe as the start value in maxLik

我正在使用 maxLik 进行最大似然估计,这需要指定起始值。除了指定单个值,有什么方法可以让我使用矩阵中的所有值作为起始值?

我当前的 maxLik 代码是:

f12 <- function(param){
  alpha <- param[1]
  rho <- param[2]
  lambda <- param[3]
  u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
  p <- 1/(1 + exp(-rho*u))
  f <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))}

ml <- maxLik(f12, start = c(alpha = 1, rho=2, lambda = 1), method = "NM")

我创建了一个包含潜在起始值上限和下限的数据框:

st <- expand.grid(alpha = seq(0, 2, len = 100),rho = seq(0, 1, len = 100),lambda = seq(0,2, length(100))

我的函数中有 3 个参数,我的目标是循环上述数据帧中的所有值 st 和 select 运行 之后的最佳起始值向量各种起始参数的模型。

谢谢!

您在 logLik 函数中所做的是计算 alpha、lambda、rho,而您的数据已经有 them.Those 是带有 u、p 和 f12 的行(这也是您的函数名称! ).由于您的对数似然函数具有单个索引,因此也可以计算一行的对数似然。所以你运行代码使用像这样应用

#create a function to find mle estimate for first row
maxlike <- function(a) {
f12 <- function(param){
alpha <- param[1]
rho <- param[2]
lambda <- param[3]
#u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
#p <- 1/(1 + exp(-rho*u))
#f12 <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))
}
ml <- maxLik(f12, start = c(alpha = 1, rho=2, lambda = 1), method = "NM")
}
#then using apply with data = st, 2 means rows and your mle function
mle <- apply(st,2,maxlike)
mle

考虑 Mapmapply 的包装器)通过您的方法按元素传递 st 列。此处,Map 将 return 包含其他组件列表的 maxLik objects, specifically inherited maxim class 对象列表。此列表中的项目数将等于 st 的行数。

注意输入参数,ar,和l被传入start maxLik() 的参数并且不再是硬编码整数。 f12 保持不变。

maxLik_run <- function(a, r, l) {
   tryCatch({
      f12 <- function(param){
        alpha <- param[1]
        rho <- param[2]
        lambda <- param[3]
        u <- 0.5*(p12$v_50_1)^alpha + 0.5*lambda*(p12$v_50_2)^alpha
        p <- 1/(1 + exp(-rho*u))
        f <- sum(p12$gamble*log(p) + (1-p12$gamble)*log(1-p))
      }

      return(maxLik(f12, start = c(alpha = a, rho = r, lambda = l), method = "NM"))
   }, error = function(e) return(NA))  
}

st <- expand.grid(alpha = seq(0, 2, len = 100),
                  rho = seq(0, 1, len = 100),
                  lambda = seq(0, 2, length(100)))

maxLik_list <- Map(maxLik_run, st$alpha, st$rho, st$lambda)

并回答问题——运行 模型从各种起始参数 之后的最佳起始值向量——需要特定的定义 "best"。一旦你定义了这个,你可以在你的 returned 对象列表上使用 Filter() 到 select 一个或多个产生这个 "best" 的元素。

下面是一个演示,用于在每个最大似然的 最大值 中找到最大值。如果需要,请使用 estimate。请注意,如果最高值被其他列表项共享,此 returned 列表可以有多个:

highest_value <- max(sapply(maxLik_list, function(item) item$maximum))

maxLik_item_list <- Filter(function(i) i$maximum == highest_value, maxLik_list)