R 中日志函数的最大似然法
Maximum Likelihood in R for a log function
我在使用 R 中的 mle 函数时遇到了一些问题。我的模型是,
log(Y)~log(K)+log(L),当我将此模型输入 R 时,我不断收到有关缺少函数 minuslog1 的错误消息。如何使用上面列出的模型解决此问题?
下面是代码和一小部分数据。
谢谢。
> require(stats4)
Loading required package: stats4
> prod.mle<-mle(log(Y)~log(K)+log(L),) # log version
Error in minuslogl() : could not find function "minuslogl"
In addition: Warning messages:
1: In formals(fun) : argument is not a function
2: In formals(fun) : argument is not a function
DF <- structure(list(Y = c(26971.71, 330252.5, 127345.3, 3626843, 37192.73
), K = c(32.46371, 28.42238, 5.199048, 327.807, 16.01538), L = c(3013256.014,
135261574.9, 39168414.92, 1118363069, 9621912.503)),
class = "data.frame", row.names = c(NA, -5L))
stats4::mle
没有公式界面。您必须添加一个函数 minuslogl
,用于“ 计算负对数似然 ”。有关示例,请参见 ?mle
,特别是有一个示例以“## Linear regression using MLE”开头,它提供了一种编写线性回归的方法,我假设您想要。
因此对数似然可以写成(对错误对数进行转换以保持正值)为:
nll <- function(b0, b1, logsd) {
mu <- cbind(1, log(DF$K)) %*% c(b0, b1) ;
-sum(dnorm(log(DF$Y), mu, exp(logsd), log=TRUE))
}
并估计
stats4::mle(minuslog=nll, start=c(0,0,1))
bblme
软件包提供了一个公式符号,您可能会发现它更易于使用。
library(bbmle)
mod2 <- mle2(Y ~ dnorm(mean=X %*% c(b0, b1), sd=exp(logsd)),
start=list(b0=0,b1=0,logsd=1), # use named list of parameters
data=list(X=cbind(1, log(DF$K)), Y=log(DF$Y)))
summary(mod2)
它也可以与 stats4::mle
类似的语法一起使用,但允许您传递参数向量和数据参数,这可以使代码更简洁。
nll2 <- function(par) {
mu <- X %*% par[1:2] ;
-sum(dnorm(Y, mu, exp(par[3]), log=TRUE))
}
# set the parameter names & set `vecpar` to TRUE
parnames(nll2) <- c("b0", "b1", "logsd")
mod3 <- mle2(nll2,
start=list(b0=0,b1=0,logsd=1),
data=list(X=cbind(1, log(DF$K)), Y=log(DF$Y)), vecpar=TRUE)
summary(mod3)
我在使用 R 中的 mle 函数时遇到了一些问题。我的模型是, log(Y)~log(K)+log(L),当我将此模型输入 R 时,我不断收到有关缺少函数 minuslog1 的错误消息。如何使用上面列出的模型解决此问题?
下面是代码和一小部分数据。
谢谢。
> require(stats4)
Loading required package: stats4
> prod.mle<-mle(log(Y)~log(K)+log(L),) # log version
Error in minuslogl() : could not find function "minuslogl"
In addition: Warning messages:
1: In formals(fun) : argument is not a function
2: In formals(fun) : argument is not a function
DF <- structure(list(Y = c(26971.71, 330252.5, 127345.3, 3626843, 37192.73
), K = c(32.46371, 28.42238, 5.199048, 327.807, 16.01538), L = c(3013256.014,
135261574.9, 39168414.92, 1118363069, 9621912.503)),
class = "data.frame", row.names = c(NA, -5L))
stats4::mle
没有公式界面。您必须添加一个函数 minuslogl
,用于“ 计算负对数似然 ”。有关示例,请参见 ?mle
,特别是有一个示例以“## Linear regression using MLE”开头,它提供了一种编写线性回归的方法,我假设您想要。
因此对数似然可以写成(对错误对数进行转换以保持正值)为:
nll <- function(b0, b1, logsd) {
mu <- cbind(1, log(DF$K)) %*% c(b0, b1) ;
-sum(dnorm(log(DF$Y), mu, exp(logsd), log=TRUE))
}
并估计
stats4::mle(minuslog=nll, start=c(0,0,1))
bblme
软件包提供了一个公式符号,您可能会发现它更易于使用。
library(bbmle)
mod2 <- mle2(Y ~ dnorm(mean=X %*% c(b0, b1), sd=exp(logsd)),
start=list(b0=0,b1=0,logsd=1), # use named list of parameters
data=list(X=cbind(1, log(DF$K)), Y=log(DF$Y)))
summary(mod2)
它也可以与 stats4::mle
类似的语法一起使用,但允许您传递参数向量和数据参数,这可以使代码更简洁。
nll2 <- function(par) {
mu <- X %*% par[1:2] ;
-sum(dnorm(Y, mu, exp(par[3]), log=TRUE))
}
# set the parameter names & set `vecpar` to TRUE
parnames(nll2) <- c("b0", "b1", "logsd")
mod3 <- mle2(nll2,
start=list(b0=0,b1=0,logsd=1),
data=list(X=cbind(1, log(DF$K)), Y=log(DF$Y)), vecpar=TRUE)
summary(mod3)