繁体   English   中英

使用R评估和绘制3D对数似然函数

[英]Evaluating and plotting a 3d log-likelihood function using R

我的目标是使用两个参数评估并绘制以下对数似然函数:

set.seed(123)
N = 100
x = 4*rnorm(N)
y = 0.8*x + 2*rnorm(N);

LogL <- function(param,x,y,N){
        beta = param[1]
        sigma2 = param[2]
        LogLikelihood =  -N/2*log(2*pi*sigma2) - sum( (y - beta*x)^2 / (2*sigma2) ) }

我尝试使用“外部”以便在以下线程中使用“线框”:

如何在R中绘制3D函数?

但没有成功:

param1 <- seq(-2, 2, length= 30)
param2 <- seq(0.1, 4, length= 30)
values1 <- matrix(c(param1,param2),30)
z <- outer(values1, x=x,y=y,N=N, LogL)

在这种情况下,如何正确使用“外部”? 还有其他方法可以评估和绘制“ LogL”函数吗?

第一个问题是, LogL() outer()需要将LogL()的两个参数作为单独的向量,这意味着重写函数以使用两个参数,而不是解压缩的一个length 2参数。 此外,(来自?outer)

在调用FUN之前,每个参数将通过rep扩展为X和Y的长度乘积。

因此该函数需要在一次调用中处理X和Y的所有可能值。 可能有更好的方法,但是为了简单起见,我使用了一个for()循环遍历X和Y的不同值。

set.seed(123)
N = 100
x = 4*rnorm(N)
y = 0.8*x + 2*rnorm(N);

LogL <- function(param1, param2, x, y, N){
  beta = param1
  sigma2 = param2
  LogLikelihood = vector("numeric",length(beta))
  for (i in 1:length(beta)){
    LogLikelihood[i] = -N/2*log(2*pi*sigma2[i]) - sum( (y - beta[i]*x)^2 / (2*sigma2[i]) )
  }
  return(LogLikelihood)
}

param1 <- seq(-2, 2, length= 30)
names(param1) <- param1
param2 <- seq(0.1, 4, length= 30)
names(param2) <- param2


z <- outer(X = param1, Y = param2, FUN = LogL, N = N, x = x, y = y)

require(lattice)
#> Loading required package: lattice
wireframe(z, drape=T, col.regions=rainbow(100))

# test it out
LogL(param1[3], param2[3],  x = x, y = y, N = N)
#> [1] -11768.37

z[3,3]
#> [1] -11768.37

那行得通。

reprex软件包 (v0.2.0)创建于2018-03-13。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM