gpt4 book ai didi

r - 将函数参数传递给 mle() 以获得对数似然

转载 作者:行者123 更新时间:2023-12-01 03:46:19 26 4
gpt4 key购买 nike

我正在使用 mle() 方法在 R 中手动估计具有多个预测变量的 logit 回归。我在传递函数 calcLogLikelihood 中计算对数似然所需的附加参数时遇到问题以下。

这是我计算负对数似然的函数。

calcLogLikelihood <- function(betas, x, y) { 
# Computes the negative log-likelihood
#
# Args:
# x: a matrix of the predictor variables in the logit model
# y: a vector of the outcome variable (e.g. living in SF, etc)
# betas: a vector of beta coefficients used in the logit model
#
# Return:
# llf: the negative log-likelihood value (to be minimized via MLE)
#
# Error handling:
# Check if any values are null, and whether there are same number of coefficients as there are predictors
if (TRUE %in% is.na(x) || TRUE %in% is.na(y)) {
stop(" There is one or more NA value in x and y!")
}
nbetas <- sapply(betas, length)
if (nbetas-1 != ncol(x)) {
print(c(length(betas)-1, length(x)))
stop(" Categorical vector and coef vector of different lengths!")
}
linsum <- betas$betas[1] + sum(betas$betas[2:nbetas] * x)
p <- CalcInvlogit(linsum)
llf <- -1 * sum(data$indweight * (y * log(p) + (1-y) * log(1-p)))
return(llf)

}

这是我的 x 和 y 数据矩阵的样子:
> head(x)
agebucket_(0,15] agebucket_(15,30] agebucket_(30,45] agebucket_(45,60] agebucket_(60,75]
1 0 0 1 0 0
2 0 0 1 0 0
3 0 0 1 0 0
4 0 0 1 0 0
5 0 0 1 0 0
6 0 0 0 1 0

> head(y)
[,1]
[1,] 1
[2,] 1
[3,] 0
[4,] 0
[5,] 1
[6,] 0

这是对我的函数的调用:
# Read in data
data <- read.csv("data.csv")

# cont.x.vars and dummy.x.vars are arrays of predictor variable column names
x.vars <- c(cont.x.vars, dummy.x.vars)

# Select y column. This is the dependent variable name.
y.var <- "Housing"

# Select beta starting values
betas <- list("betas"=c(100, rep(.1, length(x.vars))))

# Select columns from the original dataframe
x <- data.matrix(data[, x.vars])
y <- data.matrix(data[, y.var])

# Minimize LLF
fit <- mle(calcLogLikelihood, betas, x=x, y=y)

这是我的错误信息:
 Error in is.na(x) : 'x' is missing 

这个错误似乎即将到来,因为我没有传递 calcLogLikelihood 所需的 x 和 y 参数。正确,但我不确定出了什么问题。我该如何解决这个错误?

最佳答案

出现错误是因为函数 stats4::mle 没有使用省略号参数将任何参数传递给似然函数。相反,省略号用于将更多参数传递给 optim(参见 ?stats4::mle)。您必须注意您的似然函数只是要优化的参数的函数。数据,即 x 和 y,不能在对 mle 的调用中传递。

你有两个选择。 1. 重新定义似然函数。您可以依赖 R 的词法范围规则,因为您将数据 (x, y) 视为自由变量(只需从函数定义中删除参数 x 和 y 并在您的工作区中定义 x 和 y),或者您定义一个闭包明确哪个是更强大的解决方案并解释了(例如)here . 2. 你也可以使用 optim 而不是 mle,它允许你保留你对似然的定义,并且被 mle 在后台用作优化器。

关于r - 将函数参数传递给 mle() 以获得对数似然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com