我正在尝试通过编写高斯对数似然函数来学习R语言,以便使用
我按照许多用户编写的函数的惯例编写了一个函数,如
下面是我的完整代码和模拟数据。运行它,您会发现与
以下是输出内容:
optim()
进行求解。但是,经过几个小时的努力,我仍然偏离了正确的方向。(这不是作业而是自学。)我按照许多用户编写的函数的惯例编写了一个函数,如
loglik <- function(theta, y, x)
,其中theta
是权重向量beta
和sigma
的组合,y
是输出结果,x
是数据。下面是我的完整代码和模拟数据。运行它,您会发现与
lm()
相比,我的函数偏离了正确的方向。有人能给我一些关于我错在哪里的想法吗?# random data
set.seed(111)
y = sample(1:100,100)
x1 = sample(1:100,100)*rnorm(1,0)
x2 = sample(x1)*rnorm(1,0)
x3 = sample(x2)*rnorm(1,0)
dat = data.frame(x1,x2,x3)
# define gaussian log-likelihood
logLik <- function(theta, Y, X){
X <- as.matrix(X) # convert data to matrix
k <- ncol(X) # get the number of columns (independent vars)
beta <- theta[1:k] # vector of weights intialized with starting values
expected_y <- X %*% beta # X is dimension (n x k) and beta is dimension (k x 1)
sigma2 <- theta[k+1] # should be pulled from the last of the starting values vector
LL <- sum(dnorm(Y, mean = expected_y, sd = sigma2, log = T)) # sum of the PDF over each observation
return(-LL)
}
以下是输出内容:
> optim(logLik, par=starting_values, method="Nelder-Mead", Y=y, X=dat, hessian = T)$par
[1] 0.4832514 -0.2276684 -0.3860800 32.7168490 -38.9030319
> coefficients(lm(y~x1+x2+x3))
(Intercept) x1 x2 x3
58.17347451 -0.06587320 0.13001865 -0.03624233