理解optim()和lm()的不同结果

时间:2014-10-03 09:37:12

标签: r

假设:

   set.seed(1001)
   outcome<-rnorm(1000,sd = 1)
   covariate<-rnorm(1000,sd = 1)

普通pdf的对数似然性:

   loglike <- function(par, outcome, covariate){
               cov <- as.matrix(cbind(1, covariate))
               xb <- cov * par
              (- 1/2* sum((outcome - xb)^2))
   }

优化:

                  opt.normal <- optim(par = 0.1,fn = loglike,outcome=outcome,cov=covariate, method = "BFGS",  control = list(fnscale = -1),hessian = TRUE)

但是,在运行简单的OLS时,我会得到不同的结果。然而,最大化log-likelihhod和最小化OLS应该让我得到类似的估计。我想我的优化有问题。

                  summary(lm(outcome~covariate))

2 个答案:

答案 0 :(得分:5)

嗯几件事......这是一个正确的工作可能性函数(名称为x和y):

loglike =
function(par,x,y){cov = cbind(1,x); xb = cov %*% par;(-1/2)*sum((y-xb)^2)}

注意使用矩阵乘法运算符。

你也只用一个par参数运行它,所以它不仅因为你的loglike正在进行元素乘法而被打破,它只返回一个值。

现在将优化器参数与lm系数进行比较:

opt.normal <- optim(par = c(0.1,0.1),fn = loglike,y=outcome,x=covariate, method = "BFGS",  control = list(fnscale = -1),hessian = TRUE)
opt.normal$par
[1]  0.02148234 -0.09124299
 summary(lm(outcome~covariate))$coeff
               Estimate Std. Error    t value    Pr(>|t|)
(Intercept)  0.02148235 0.03049535  0.7044466 0.481319029
covariate   -0.09124299 0.03049819 -2.9917515 0.002842011

沙札姆。

有用的提示:创建您知道正确答案的数据 - 例如x=1:10; y=rnorm(10)+(1:10),因此您知道斜率为1且截距为0.然后您可以轻松地看到哪些东西在正确的球场。另外,单独运行loglike函数,看它是否符合您的预期。

答案 1 :(得分:0)

也许您会发现从我的代码中看到这两种方法之间的区别很有用。我用以下方式编程。

data.matrix <- as.matrix(hprice1[,c("assess","bdrms","lotsize","sqrft","colonial")])
loglik <- function(p,z){
  beta <- p[1:5]
  sigma <- p[6]
  y <- log(data.matrix[,1])
  eps <- (y - beta[1] - z[,2:5] %*% beta[2:5])
  -nrow(z)*log(sigma)-0.5*sum((eps/sigma)^2)
}
p0 <- c(5,0,0,0,0,2)
m <- optim(p0,loglik,method="BFGS",control=list(fnscale=-1,trace=10),hessian=TRUE,z=data.matrix)


rbind(m$par,sqrt(diag(solve(-m$hessian))))

对于lm()方法,我找到了

m.ols <- lm(log(assess)~bdrms+lotsize+sqrft+colonial,data=hprice1)
summary(m.ols)

此外,如果您想估计相对于手数的评估值的弹性或计算95%的置信区间 对于此参数,您可以使用以下

elasticity.at.mean <- mean(hprice1$lotsize) * m$par[3]
var.coefficient <- solve(-m$hessian)[3,3]
var.elasticity <- mean(hprice1$lotsize)^2 * var.coefficient
# upper bound
elasticity.at.mean + qnorm(0.975)* sqrt(var.elasticity)
# lower bound
elasticity.at.mean + qnorm(0.025)* sqrt(var.elasticity)

下面给出了针对二项分布的optim方法的更简单示例。

loglik1 <- function(p,n,n.f){
  n.f*log(p) + (n-n.f)*log(1-p)
}

m <- optim(c(pi=0.5),loglik1,control=list(fnscale=-1),
           n=73,n.f=18)
m

m <- optim(c(pi=0.5),loglik1,method="BFGS",hessian=TRUE,
           control=list(fnscale=-1),n=73,n.f=18)
m

pi.hat <- m$par

s.d的数值计算

rbind(pi.hat=pi.hat,sd.pi.hat=sqrt(diag(solve(-m$hessian))))

分析

rbind(pi.hat=18/73,sd.pi.hat=sqrt((pi.hat*(1-pi.hat))/73))

或此代码为正态分布。

loglik1 <- function(p,z){
  mu <- p[1]
  sigma <- p[2]

  -(length(z)/2)*log(sigma^2) - sum(z^2)/(2*sigma^2) + 
    (mu*sum(z)/sigma^2) - (length(z)*mu^2)/(2*sigma^2)
}

m <- optim(c(mu=0,sigma2=0.1),loglik1,
           control=list(fnscale=-1),z=aex)