[英]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) ) }
我尝试使用“外部”以便在以下线程中使用“线框”:
但没有成功:
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.