You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言中绘制给定PDF的洛伦兹曲线?

在R中绘制洛伦兹曲线的实操步骤

首先要说明:你提供的Cdf函数存在问题——函数内未定义term4(该变量仅在PDF函数中出现),直接运行会报错。下面是修正后的完整流程,基于给定参数a=l=b=1实现:

1. 定义并验证PDF函数

先整理给定的PDF函数,保留通用形式方便后续参数调整,同时代入参数测试:

# 定义PDF函数
L <- function(x, a, l, b) {
  term1 <- exp(-l*x - (b*x)^a)
  term2 <- a*l*(b*x)^a
  term3 <- a*b*(1+l)*((b*x)^(a-1))
  term4 <- (l^2)*(1+x)
  pdf <- (term1/(1+l))*(term2 + term3 + term4)
  return(pdf)
}

# 代入参数a=l=b=1,测试x=0时的PDF值
L(0, 1, 1, 1) # 预期输出1.5,符合推导结果

2. 计算CDF(累积人口比例)

由于原CDF函数有缺陷,我们用数值积分计算CDF(复杂分布下更可靠):

# 定义CDF函数:PDF从0到x的积分
Cdf <- function(x, a, l, b) {
  integrate(L, lower = 0, upper = x, a = a, l = l, b = b)$value
}

# 向量化CDF函数,支持批量计算
Cdf_vec <- Vectorize(Cdf, vectorize.args = "x")

3. 计算洛伦兹曲线所需的累积收入比例

洛伦兹曲线的纵轴是累积收入占总财富的比例,需要先计算两个核心值:

  • 每个x对应的累积收入:$\int_0^x t \cdot f(t) dt$
  • 总体均值(总财富):$E[X] = \int_0^\infty t \cdot f(t) dt$
# 定义计算累积收入的函数
cumulative_income <- function(x, a, l, b) {
  integrand <- function(t) t * L(t, a, l, b)
  integrate(integrand, lower = 0, upper = x)$value
}

# 向量化该函数
cumulative_income_vec <- Vectorize(cumulative_income, vectorize.args = "x")

# 计算总体均值E[X](取x=10作为上限,此时PDF已趋近于0)
mean_X <- cumulative_income(10, 1, 1, 1)

4. 生成数据并绘制洛伦兹曲线

选择x的取值范围(如0到5,此时PDF已几乎衰减为0),生成数据后绘图:

# 生成x序列
x_seq <- seq(0, 5, by = 0.01)

# 计算横轴(累积人口比例)和纵轴(累积收入比例)数据
F_x <- Cdf_vec(x_seq, 1, 1, 1)
L_x <- cumulative_income_vec(x_seq, 1, 1, 1) / mean_X

# 绘制洛伦兹曲线
plot(F_x, L_x, type = "l", lwd = 2, col = "blue",
     xlab = "累积人口比例", ylab = "累积收入比例",
     main = "洛伦兹曲线(a=l=b=1)")
# 添加绝对平等的45度参考线
abline(0, 1, lty = 2, col = "red")
# 添加图例
legend("topleft", legend = c("洛伦兹曲线", "绝对平等线"),
       col = c("blue", "red"), lty = c(1, 2), lwd = 2)

补充说明

  • 如果需要解析形式的CDF,可以手动计算PDF的积分,但数值积分在复杂分布下更省心且不易出错。
  • x的取值范围可根据PDF的衰减速度调整,比如当x增大到PDF值小于1e-6时,即可停止计算。

内容的提问来源于stack exchange,提问作者Deepthy Gs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:10:21