ggplot2 stat_function绘制错误的函数

时间:2014-06-26 01:45:08

标签: r ggplot2

我想绘制一系列独立的伯努利分布随机变量y的对数似然函数,其中参数p是某个特征x的函数(逻辑函数)。该逻辑函数还具有参数b。这是我想要估计的参数。所以我想将对数似然作为b的函数。我想在R中使用ggplot2这样做,因为我希望在那些中变得更好。

我可以而且应该更好地创建对数似然函数,但这不是我的观点。问题是绘制的对数似然在区间(-5,5)内是恒定的。这似乎是错的。特别是,因为当我在该区间中使用一些任意b调用该函数时,它返回一个不同的值。为什么会这样?谢谢。

library(ggplot2)
set.seed(123)

# parameters 
n=100
mu=0
s=2
b<-0.2

# functions 
logit <- function(x,b){1/(1+exp(-b*x))}

# simulation of data
x<-rnorm(n,mu,s)
y_prob<-logit(x,b)
y<-rbinom(n,1,y_prob)
df<-data.frame(x,y)

# loglikelihood function 
loglikelihood<-function(b,df){
  prd<-1
  for (i in 1:NROW(df)){
    events<-logit(df$x[i],b)
    nonevents<-1-events
    prd<-prd*events^df$y[i]*nonevents^(1-df$y[i])
  }
  return(sum(log(prd)))
}


loglikelihood(0.3,df)

p2<-ggplot(data=data.frame(b=c(-5,5)), aes(b)) + stat_function(fun=loglikelihood, args=list(df=df))
p2<-p2+xlab("b") + ylab("loglikelihood")
p2

1 个答案:

答案 0 :(得分:3)

问题是你的对数似然函数。您必须将“矢量化”函数传递给stat_function。如果传入向量,R中的大多数函数将返回向量。例如sin(1:10)将返回数字1到10的正弦值。但是,当向量函数传递值时,只返回一个值

loglikelihood(seq(-5,5, by=.1), df)
# [1] -20534.44

由于它的行为不像“普通”R函数,因此存在此问题。解决此问题的最简单方法是将函数定义包装在Vectorize命令中。观察

vloglikelihood <- Vectorize(loglikelihood, vectorize.args="b")
vloglikelihood(seq(-5,5, by=.1), df)
# [1] -463.67919 -454.67142 -445.66980 -436.67470 -427.68654 -418.70574 ...

现在它vloglikelihood表现得像一个好的R函数应该。然后我们可以像你一样绘制它

ggplot(data=data.frame(b=c(-5,5)), aes(b)) + 
    stat_function(fun=vloglikelihood, args=list(df=df)) +
    xlab("b") + ylab("loglikelihood")

enter image description here