我正在尝试使用对数正态分布式误差项来估计线性模型。我已经为具有正态分布错误的线性模型提供了工作代码:
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 = ...))
除非我弄错了,否则这是对数似然的定义(密度的对数总和)。
答案 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))
现在一切正常!