从0开始学习R语言--Day52--weibull

在分析带有状态变化特征的数据时(如医疗数据的结局特征,手机电池的寿命等等),我们需要分析得不只是什么时候什么时候出发结局,还要分析特征的稳定性,比如电池的续航在初期不稳定,预测里可能两个月就会坏,但用了一个月后手机稳定下来,预测可能就变成用一年都不会坏。weibull分布能帮我们捕捉这种特征,从而能够做后续的处理(比如维修计划,对病人的结局分析作进一步拆解)。

以下是一个例子:

R 复制代码
# 加载必要的包
library(ggplot2)
library(MASS)
library(fitdistrplus)  # 提供更稳健的拟合方法

# 1. 生成更理想的Weibull分布数据集
set.seed(123)
n <- 1000
shape <- 1.5
scale <- 2.0

# 生成数据并添加保护措施
weibull_data <- rweibull(n, shape = shape, scale = scale)
weibull_data <- pmax(weibull_data, .Machine$double.eps)  # 确保严格大于0

# 2. 方法一:使用fitdistrplus包(更稳健)
fit_fitdistrplus <- fitdist(weibull_data, "weibull", 
                            method = "mle",  # 最大似然估计
                            control = list(trace = 0),  # 关闭冗长输出
                            lower = c(shape = 0.1, scale = 0.1))  # 参数下限

# 显示拟合结果
summary(fit_fitdistrplus)

# 3. 方法二:手动优化(完全控制过程)
# 定义负对数似然函数
weibull_nll <- function(params, data) {
  shape <- params[1]
  scale <- params[2]
  if(shape <= 0 || scale <= 0) return(Inf)  # 参数必须为正
  -sum(dweibull(data, shape = shape, scale = scale, log = TRUE))
}

# 使用optim进行优化
initial_params <- c(shape = 1, scale = 1)  # 初始值
optim_result <- optim(initial_params, 
                      weibull_nll, 
                      data = weibull_data,
                      method = "L-BFGS-B",
                      lower = c(0.1, 0.1),
                      upper = c(10, 10))

if(optim_result$convergence == 0) {
  cat("\n手动优化结果:\n")
  cat("估计形状参数:", round(optim_result$par["shape"], 4), "\n")
  cat("估计尺度参数:", round(optim_result$par["scale"], 4), "\n")
} else {
  cat("优化未收敛\n")
}

# 4. 可视化比较
par(mfrow = c(1, 2))
# 直方图与拟合密度
hist(weibull_data, prob = TRUE, breaks = 30, col = "lightblue",
     main = "Weibull分布拟合")
curve(dweibull(x, shape = shape, scale = scale), 
      col = "red", lwd = 2, add = TRUE)  # 真实分布
curve(dweibull(x, shape = fit_fitdistrplus$estimate["shape"],
               scale = fit_fitdistrplus$estimate["scale"]),
      col = "blue", lwd = 2, lty = 2, add = TRUE)  # 拟合分布
legend("topright", legend = c("真实", "拟合"), 
       col = c("red", "blue"), lty = 1:2, lwd = 2)

# QQ图
qqplot(qweibull(ppoints(weibull_data), 
                shape = fit_fitdistrplus$estimate["shape"],
                scale = fit_fitdistrplus$estimate["scale"]),
       weibull_data,
       main = "Weibull QQ图",
       xlab = "理论分位数", ylab = "样本分位数")
abline(0, 1, col = "red")

输出:

R 复制代码
Fitting of the distribution ' weibull ' by maximum likelihood 
Parameters : 
      estimate Std. Error
shape 1.511529  0.0356495
scale 2.012800  0.0488228
Loglikelihood:  -1480.976   AIC:  2965.953   BIC:  2975.768 
Correlation matrix:
          shape     scale
shape 1.0000000 0.2164548
scale 0.2164548 1.0000000

手动优化结果:
估计形状参数: 1.5116 
估计尺度参数: 2.0128

输出中的形状参数和尺度参数都和真实值非常接近,说明模型的结果很精确;直方图和红色曲线图基本重合,说明数据非常符合分布,而QQ图中大部分数据点也都落在了对角线上,进一步说明了结果的可靠性。

相关推荐
Coovally AI模型快速验证6 小时前
从避障到实时建图:机器学习如何让无人机更智能、更安全、更实用(附微型机载演示示例)
人工智能·深度学习·神经网络·学习·安全·机器学习·无人机
东木君_6 小时前
RK3588:MIPI底层驱动学习——入门第三篇(IIC与V4L2如何共存?)
学习
say_fall6 小时前
C语言底层学习(2.指针与数组的关系与应用)(超详细)
c语言·开发语言·学习
风已经起了7 小时前
FPGA学习笔记——图像处理之对比度调节(直方图均衡化)
图像处理·笔记·学习·fpga开发·fpga
!chen9 小时前
学习 React 前掌握 JavaScript 核心概念
javascript·学习·react.js
Hey! Hey!9 小时前
DBA 系统学习计划(从入门到进阶)
数据库·学习·dba
leo_yu_yty9 小时前
Mysql DBA学习笔记(客户端常用工具)
学习·mysql·dba
小狗爱吃黄桃罐头9 小时前
正点原子【第四期】Linux之驱动开发学习笔记-6.1 pinctrl和gpio子系统
linux·驱动开发·学习
咩?10 小时前
深度学习中的关键工具与数据处理方法
深度学习·学习
sjh210010 小时前
【学习笔记】20年前的微芯an1078foc技术,smo滑模位置估计,反电动势波形还不错,为何位置估计反而超前了呢?
笔记·学习