gpt4 book ai didi

r - ggplot2 stat_function 绘制了错误的函数

转载 作者:行者123 更新时间:2023-12-02 11:41:17 26 4
gpt4 key购买 nike

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

最佳答案

问题出在你的对数似然函数上。您必须将“向量化”函数传递给 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

关于r - ggplot2 stat_function 绘制了错误的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com