在R中绘制3D对数似然图

时间:2014-12-02 17:26:22

标签: r

我想尝试使用R来绘制具有两个参数的模型的3D对数似然图。

我的功能如下:

  negL=function(theta,data){
    mu=theta[1]
    tau=theta[2]

  n11=data$ev.trt
  n12=data$n.trt-data$ev.trt
  n21=data$ev.ctrl
  n22=data$n.ctrl-data$ev.ctrl
  odds=(n11*n22)/(n12*n21)
  logodds=log(odds)
  varodds=(1/n11)+(1/n12)+(1/n21)+(1/n22)

  x=logodds
  sigma=varodds

  L=-(1/2)*sum(log((2*pi)*(sigma+tau)))-(1/2)*sum((((x-mu)^2))/(sigma+tau))
  return(-L)
  }

这里L是我的似然函数。

我想尝试根据这些数据绘制对数似然图:

          Author ev.ctrl n.ctrl ev.trt n.trt duration
1         RAPID1      15    199    146   393    6.150
2         RAPID2       4    127     80   246    5.850
3        Kim2007       9     63     28    65    6.850
4          DE019      19    200     81   207   10.950
5         ARMADA       5     62     37    67   11.650
6  Weinblatt1999       1     30     23    59   13.000
7          START      33    363    110   360    8.100
8         ATTEST      22    110     61   165    7.850
9        Abe2006       1     47     15    49    8.300
10    Strand2006       5     40      5    40   11.250
11      CHARISMA      14     49     26    50    0.915
12        OPTION      22    204     90   205    7.650

我使用R optim()

计算了theta的最大似然估计值(1.6760569 0.2112315)

基本上我想要μ出现在x轴上,tau出现在y轴上,然后是log对象-L出现在z轴上。

我尝试将其添加到我的功能

  persp3d(negL, c(0,6), c(-1,3), col="red", xlab="mu", ylab="tau^2", zlab="Likelihood",
      main="Perspective plot of Likelihood")
在另一个网页上看到它后,从rgl包中获取

但是我收到错误说:

Error in (function (theta)  : 
  unused argument (c(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, 
-0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96, -0.96,

当我尝试运行它时。

非常感谢任何有关如何使用此功能和使用功能的想法。

非常感谢

1 个答案:

答案 0 :(得分:1)

这是你想要实现的目标吗?

negL<- function(mu,tau,data){  
  n11=data$ev.trt
  n12=data$n.trt-data$ev.trt
  n21=data$ev.ctrl
  n22=data$n.ctrl-data$ev.ctrl
  odds=(n11*n22)/(n12*n21)
  logodds=log(odds)
  varodds=(1/n11)+(1/n12)+(1/n21)+(1/n22)
  x=logodds
  sigma=varodds
  L=-(1/2)*sum(log((2*pi)*(sigma+tau)))-(1/2)*sum((((x-mu)^2))/(sigma+tau))
  return(-L)
}
f <- Vectorize(negL,vectorize.args=c("mu","tau"))
library(rgl)
mu  <- seq(0,6,0.1)
tau <- seq(0,3,0.1)
z <- outer(mu,tau,f,data=data)
zlim    <- range(z[!is.na(z)])
palette <- rev(rainbow(20))
colors  <- palette[19*(z-zlim[1])/diff(zlim) + 1] 

persp3d(mu,tau,z,col=colors)

所以有几个问题。

首先,persp3d(...)有3个参数:x是定义x轴的向量,y是定义y轴的向量,z是具有尺寸长度(x)x长度(y)的矩阵其中每个元素对于zx的组合的值为y。您必须设置向量xy以及矩阵z(如上面的代码所示)。

设置z矩阵的一种方法是使用outer(x,y,FUN)函数(阅读文档)。这需要两个向量xy,并返回在FUNx的每个组合上评估函数y的结果。但它需要FUN矢量化,而negL(...)则不是。{1}}。因此,我们创建了一个新函数f(...),它是negL(...)的矢量化版本。

第三,函数negL(...)必须采用两个参数mutau,而不是带有两个元素(theta)的向量。所以我改变了函数的签名来做到这一点。除此之外,该功能与您的问题相同。

最后,在你的问题中,你(似乎......)想要使用tau的负值。但negL(...)未定义tau < 0