使用R的对数正态分布的最大似然估计

时间:2015-03-05 11:37:29

标签: r

我正在尝试使用对数正态分布式误差项来估计线性模型。我已经为具有正态分布错误的线性模型提供了工作代码:

library(Ecdat)
library(assertthat)
library(maxLik)

# Load the data
data(Wages1)

# Check what R says
summary(lm(wage ~ school + exper + sex, data = Wages1))


# Use maxLik from package maxLik
# The likelihood function
my_log_lik_pos <- function(theta, data){
    y <- data[, 1]
    x <- data[, -1]
    beta <- head(theta, -1)
    sigma <- tail(theta, 1)
    xb <- x%*%beta
    are_equal(dim(xb), c(nrow(my_data), 1))
    return(sum(log(dnorm(y, mean = xb, sd = sigma))))
}

# Bind the data
my_data <- cbind(Wages1$wage, 1, Wages1$school, Wages1$exper, Wages1$sex)

my_problem <- maxLik(my_log_lik_pos, data = my_data, 
              start = rep(1,5), method = "BFGS")

summary(my_problem)

我得到大致相同的结果。现在我尝试做同样的事情,但使用对数正态似然。为此,我必须首先模拟一些数据:

true_beta <- c(0.1, 0.2, 0.3, 0.4, 0.5)

ys <- my_data[, -1] %*% head(true_beta, -1) + 
      rlnorm(nrow(my_data), 0, tail(true_beta, 1))

my_data_2 <- cbind(ys, my_data[, -1])

对数似然函数:

my_log_lik_lognorm <- function(theta, data){
    y <- data[, 1]
    x <- data[, -1]
    beta <- head(theta, -1)
    sigma <- tail(theta, 1)
    xb <- x%*%beta
    are_equal(dim(xb), c(nrow(data), 1))
    return(sum(log(dlnorm(y, mean = xb, sd = sigma))))
}

my_problem2 <- maxLik(my_log_lik_lognorm, data = my_data_2, 
               start = rep(0.2,5), method = "BFGS")

summary(my_problem2)

估计的参数应该在true_beta的值附近,但由于某种原因,我发现完全不同的值。我尝试了不同的方法,不同的起始值但无济于事。我确信我错过了一些明显的东西,但我看不出是什么。

我是否正确地假设对数正态分布的对数似然是:

sum(log(dlnorm(y, mean = .., sd = ...))

除非我弄错了,否则这是对数似然的定义(密度的对数总和)。

1 个答案:

答案 0 :(得分:2)

我发现了问题:问题似乎不是我的对数似然函数。当我尝试用glm估计模型时:

summary(glm(ys ~ school + exper + sex, family=gaussian(link="log"), data=Wages1))

我得到与maxLik和我的对数似然相同的结果。当我试图模拟一些数据时,问题似乎来自:

ys <- my_data[, -1] %*% head(true_beta, -1) + 
          rlnorm(nrow(my_data), 0, tail(true_beta, 1))

模拟数据的正确方法:

ys <-  rlnorm(nrow(my_data), my_data[, -1] %*% head(true_beta, -1), tail(true_beta, 1))

现在一切正常!