我想尝试使用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,
当我尝试运行它时。
非常感谢任何有关如何使用此功能和使用功能的想法。
非常感谢
答案 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)的矩阵其中每个元素对于z
和x
的组合的值为y
。您必须设置向量x
和y
以及矩阵z
(如上面的代码所示)。
设置z
矩阵的一种方法是使用outer(x,y,FUN)
函数(阅读文档)。这需要两个向量x
和y
,并返回在FUN
和x
的每个组合上评估函数y
的结果。但它需要FUN
是矢量化,而negL(...)
则不是。{1}}。因此,我们创建了一个新函数f(...)
,它是negL(...)
的矢量化版本。
第三,函数negL(...)
必须采用两个参数mu
和tau
,而不是带有两个元素(theta
)的向量。所以我改变了函数的签名来做到这一点。除此之外,该功能与您的问题相同。
最后,在你的问题中,你(似乎......)想要使用tau
的负值。但negL(...)
未定义tau < 0
。