如何在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
相关产品推荐
相关产品推荐

