繁体   English   中英

如何将数据帧中的所有值作为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和各种参数开始运行模型之后选择初始值的最佳载体。

谢谢!

考虑Map (包装到mapply )以通过方法元素方式传递st列。 这里, Map将返回一个maxLik对象列表,特别是继承的包含其他组件列表的maxim类对象。 此列表中的项目数将等于st的行数。

注意输入参数arl被传递到maxLik() start参数,而不再是硬编码的整数。 并且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)

并且回答这个问题 - 从各种起始参数运行模型后的起始值的最佳向量 - 需要特定的“最佳”定义。 一旦定义了这个,就可以在返回的对象列表中使用Filter()来选择产生“最佳”的一个或多个元素。

下面是一个演示,以找出每个最大似然最大值的最高值。 如果需要,使用估计 请注意,如果其他列表项共享最高值,则返回的列表可以有多个:

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

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

你在logLik函数中所做的是你正在计算alpha,lambda,rho,而你的数据已经有了它们。这些是带有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM