【问题标题】:Evaluating and plotting a 3d log-likelihood function using R使用 R 评估和绘制 3d 对数似然函数
【发布时间】:2018-08-18 12:40:31
【问题描述】:

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

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

我已尝试使用“外部”来使用“线框”,如以下线程中所示:

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)

在这种情况下如何正确使用“外部”?是否有任何其他替代方法来评估和绘制函数“LogL”?

【问题讨论】:

    标签: r function plot


    【解决方案1】:

    第一个问题是 outer() 需要将 LogL() 的两个参数作为单独的向量,这意味着重写您的函数以使用两个参数而不是您解压缩的一个长度为 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 package (v0.2.0) 于 2018 年 3 月 13 日创建。

    【讨论】:

    • 所以,问题出在函数上,很有趣。谢谢。
    • 分析结果后,我意识到outer() 没有正确评估函数,绘制对数似然的结果在wireframe(z, drape=T, col.regions=rainbow(100)) 中看起来不寻常。如何正确表述?
    • 啊,我明白了 - 该函数未正确矢量化。它将参数作为向量获取。
    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2021-10-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多