我想绘制一系列独立的伯努利分布随机变量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
答案 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")