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

时间:2017-09-24 02:43:42

标签: r loops mle

我正在使用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中的所有值,并在从各种起始参数运行模型后选择最佳的起始值向量。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

注意输入参数 a r l 被传递到{{1}的 start 参数并且不再是硬编码的整数。并且 f12 保持不变。

maxLik()

要回答问题 - 从各种起始参数运行模型后的最佳起始值向量 - 需要特定的&#34; best&#34;。一旦定义了这个,就可以在返回的对象列表中使用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) 来选择产生这个&#34; best&#34;的一个或多个元素。

以下是在每个最大可能性最大值中找到最高值的演示。如果需要,请使用估算。请注意,如果其他列表项共享最高值,则此返回列表可以包含多个列表:

Filter()

答案 1 :(得分:1)

你在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