![](/img/trans.png)
[英]How to replace values in all columns of a dataframe by a value in another dataframe
[英]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的行数。
注意输入参数a , r和l被传递到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.