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

时间:2018-03-09 21:16:32

标签: r function plot

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

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) ) }

我尝试过使用&#39;外部&#39;为了使用&#39;线框&#39;如下面的主题:

How can I plot 3D function in r?

但没有成功:

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)

我如何使用&#39;外部&#39;在这种情况下适当吗?还有其他选择来评估和绘制函数&#39; LogL&#39;?

1 个答案:

答案 0 :(得分:0)

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

  

在调用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 package(v0.2.0)创建于2018-03-13。