如何绘制对数似然函数

时间:2014-02-10 07:42:41

标签: r

我想绘制-pi和pi之间的对数似然函数。

对数似然函数

llh <- function (teta,x) {

  sum(log((1-cos(x-teta))/(2*pi)))
}

x=c(3.91,4.85,2.28,4.06,3.70,4.04,5.46,3.53,2.28,1.96,2.53,3.88,2.22,3.47,4.82,2.46,2.99,2.54,0.52,2.50)

teta=seq(-4,4, by=0.01)

y = llh(teta,x)

plot(teta, llh(teta,x), pch=16)

无法绘制该功能。这是错误消息:

Warning message:
In x - teta :
  longer object length is not a multiple of shorter object length
>   
> plot(teta, llh(teta,x), pch=16)
Error in xy.coords(x, y, xlabel, ylabel, log) : 
  'x' and 'y' lengths differ
In addition: Warning message:
In x - teta :
  longer object length is not a multiple of shorter object length

3 个答案:

答案 0 :(得分:6)

如上所述,您的函数将适用于teta和一些x值的一个值,或teta和一个x值的多个值。否则,您会收到错误的值或警告。

示例:llhteta=1的{​​{1}}:

teta=2

与:

不同
> llh(1,x)
[1] -34.88704>
> llh(2,x)
[1] -60.00497

如果你尝试做三个:

> llh(c(1,2),x)
[1] -49.50943

从根本上来自:

> llh(c(1,2,3),x)
[1] -49.52109
Warning message:
In x - teta :
  longer object length is not a multiple of shorter object length

因为R试图从长度为20的向量中减去长度为3的向量。它在长度为20的向量上重复长度为3的向量,直到它完成六次,然后它只剩下两个元素。嗯...认为R,我会这样做,但看起来不对,所以这是一个警告。

你可以重写函数来处理两个参数的向量,或者通过包装它来对函数进行矢量化。

> cos(x-c(1,2,3))
[...]
Warning message:
In x - c(1, 2, 3) :
  longer object length is not a multiple of shorter object length

ll plot

答案 1 :(得分:2)

你需要使用 sapply 这个函数(读取?sapply),因为你的代码没有被矢量化

plot(teta, sapply(X=teta, FUN=function(teta) llh(teta, x=x)), type="l")

OR

将你的函数矢量化为:

llh2 <- function (teta,x) {
  sapply(X=teta, FUN=function(teta) sum(log((1-cos(x-teta))/(2*pi))) )
}

plot(teta, llh2(teta,x), type="l")

答案 2 :(得分:0)

使用外部的另一种解决方案:

llh <- function (teta,x) {
  X <- outer(x, teta, "-")
  Y <- log((1-cos(X))/(2*pi))
  apply(Y, 2, sum)
}

x=c(3.91,4.85,2.28,4.06,3.70,4.04,5.46,3.53,2.28,1.96,2.53,3.88,2.22,3.47,4.82,2.46,2.99,2.54,0.52,2.50)

teta=seq(-4,4, by=0.01)  

plot(teta, llh(teta,x), pch=16)

我同意间隔的人,Vectorize很有意思!