我的目标是用两个参数评估和绘制以下对数似然函数:
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;?
答案 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。