我想绘制-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
答案 0 :(得分:6)
如上所述,您的函数将适用于teta
和一些x
值的一个值,或teta
和一个x
值的多个值。否则,您会收到错误的值或警告。
示例:llh
和teta=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
答案 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很有意思!