如何循环数据框中的所有值作为 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
考虑 Map
(mapply
的包装器)通过您的方法按元素传递 st 列。此处,Map
将 return 包含其他组件列表的 maxLik
objects, specifically inherited maxim class 对象列表。此列表中的项目数将等于 st 的行数。
注意输入参数,a,r,和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)
我正在使用 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
考虑 Map
(mapply
的包装器)通过您的方法按元素传递 st 列。此处,Map
将 return 包含其他组件列表的 maxLik
objects, specifically inherited maxim class 对象列表。此列表中的项目数将等于 st 的行数。
注意输入参数,a,r,和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)