4
我试图通过编码高斯对数似然来解码optim()
来学习R,但在经过数小时的汗水之后,我依然没有达到标准。 (这是自学,没有家庭作业。)在R中编码高斯对数似然编码
我下面在写这样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
您应该为X添加一个拦截列。您能告诉我们您的起始值是什么吗? (不知道当你有三列X加上一个标准偏差时你如何以5个参数结束......) –