【R语言】二项分布,正态分布,极大似然估计实现

二项分布

生成二项分布概率

复制代码
s <- 0:60
prob <- dbinom(s, size = 60, prob = 1/6)
  • s <- 0:60:生成 0 到 60 之间的整数,表示可能的成功次数。

复制代码
  dbinom(s, size = 60, prob = 1/6)
  • dbinom(x, size, prob) 计算二项分布的概率质量函数(PMF) ,即:
    P ( X = s ) = ( 60 s ) ( 1 / 6 ) s ( 5 / 6 ) 60 − s P(X = s) = \binom{60}{s} (1/6)^s (5/6)^{60-s} P(X=s)=(s60)(1/6)s(5/6)60−s

  • size = 60:表示总试验次数(即 60 次)。

  • prob = 1/6:每次试验的成功概率(如掷骰子得到 1 的概率为 1/6)。


2. 用 Base R 绘图

复制代码
plot(s, prob, type = "h")
  • plot():绘制散点图。
  • type = "h":表示绘制竖直线条,类似于直方图。

3. 用 ggplot2 绘图

复制代码
dat <- data.frame(x = s, y = prob)
ggplot(dat, aes(x = s, y = y, xend = s, yend = 0)) +
  geom_segment() + 
  theme_minimal()
代码解析
  • data.frame(x = s, y = prob):创建数据框,包含 x 轴的成功次数 sy 轴的概率 prob

复制代码
  ggplot(dat, aes(x = s, y = y, xend = s, yend = 0))
  • x = s, y = y:将 s 作为横坐标,prob 作为纵坐标。

  • xend = s, yend = 0:绘制从 (s, prob)(s, 0)竖直线段

  • geom_segment():绘制竖线 (类似于 Base R 的 type = "h")。

  • theme_minimal():应用简洁主题,去掉多余背景。

正态分布概率密度计算

r 复制代码
dnorm(10, 10, 0.1)
  • 用于计算

    正态分布的概率密度函数

    • x 是你想要计算的点。
    • mean 是正态分布的均值(平均值)。
    • sd 是正态分布的标准差。

所以,dnorm(10, 10, 0.1) 计算的是在均值为 10,标准差为 0.1 的正态分布下,点 x = 10 的概率密度值。

数学公式:

正态分布的概率密度函数(PDF)公式为:
f ( x ) = 1 2 π σ 2 exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp \left( - \frac{(x - \mu)^2}{2\sigma^2} \right) f(x)=2πσ2 1exp(−2σ2(x−μ)2)

其中:

  • x 是你要求概率密度的值。
  • μ 是正态分布的均值。
  • σ 是标准差。
r 复制代码
3.989423

pdf是可以大于1的,因为是概率密度而不是概率

生成正态分布密度范围

r 复制代码
x <- seq(from = mu - 4 * sig, to = mu + 4 * sig,
         length.out = 128)
  • mu 代表正态分布的均值(mean)。

  • sig 代表标准差(standard deviation)。

复制代码
  seq(from = ..., to = ..., length.out = ...)

是 R 中用于生成数值序列的函数。

  • from 是序列的起始值。
  • to 是序列的结束值。
  • length.out 指定生成的序列包含的元素个数。

功能:

  • 该代码生成了一个从 mu - 4 * sigmu + 4 * sig 的序列。通常,正态分布的95%数据都落在均值 ± 2倍标准差的范围内,所以 mu ± 4 * sig 给出了一个比 95% 范围更广的范围(约 99.99%)。
  • length.out = 128 指定生成的序列包含128个点,这些点均匀分布在这个范围内。

极大似然估计二项分布

r 复制代码
n <- 50  
y <- 10  

neg_log_likelihood <- function(p) {
  -dbinom(y, n, p, log = TRUE)
}

initial_guess <- 0.5

result <- optim(initial_guess, neg_log_likelihood, method = "Brent", lower = 0, upper = 1)

mle_proportion_boys <- result$par
mle_proportion_boys

详细解释:

  1. 给定的数据
    • n <- 50:总共50个人。
    • y <- 10:其中10个是男孩。
  2. 负对数似然函数的定义
    • neg_log_likelihood:该函数定义了给定男孩比例 ppp 下的负对数似然函数,表示为 −log⁡(P(y boys)),其中 P(y boys) 是二项分布的概率质量函数 dbinom(y, n, p)
    • dbinom(y, n, p, log = TRUE) 返回的是概率值的对数。
  3. 优化
    • 使用 optim() 函数进行最大化,初始猜测是 initial_guess <- 0.5,即假设男孩的比例是50%。
    • optim() 方法使用的是 "Brent" 方法,这是一个适合一维问题的优化算法,lower = 0upper = 1 限制了男孩比例 ppp 的取值范围在 0, 1 之间。
  4. 得到的结果
    • result$par 提供了使负对数似然最小的比例,这就是我们想要的最大似然估计值(MLE)。

核密度估计

r 复制代码
density.cbd <- density(x = distance.cbd, bw = 1.25, from = 0, to = 50)

代码解释:

  1. density(x = distance.cbd, bw = 1.25, from = 0, to = 50)
    • x = distance.cbddistance.cbd 是输入数据,可能是一个包含观测值的向量。
    • bw = 1.25:带宽(bandwidth)是KDE中的一个重要参数,决定了估计曲线的平滑度。较小的带宽会使曲线更接近数据点,而较大的带宽会使曲线更加平滑。bw = 1.25 指定了带宽为1.25。
    • from = 0to = 50:这些参数定义了估计的范围,即从0到50的区间内进行核密度估计。
相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa8 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio