如何在R语言中生成符合预期的指定参数EWMA控制图?
EWMA控制图生成问题解决方法
你遇到的核心问题是qcc库的ewma()函数默认输出与预期示例图不符,主要原因是函数的默认行为(如初始值设定、控制限展示、绘图元素)和示例图的要求存在差异。以下是具体分析和解决步骤:
可能的不符点
- 初始EWMA值:
qcc默认用设定的过程中心(center=100)作为第一个EWMA统计量的初始值,部分示例图会采用第一个观测值作为初始值。 - 绘图元素:
qcc的EWMA图仅展示EWMA统计量的折线,示例图可能同时包含原始观测点。 - 控制限展示:虽然
qcc默认计算动态控制限(随观测次数变化),但部分示例图可能使用稳态控制限(观测次数趋近无穷时的固定值)。
解决方法
方法1:调整qcc函数参数匹配预期
如果希望用qcc生成接近示例的图,可以手动计算EWMA统计量并叠加原始数据:
library(qcc) test <- c(100.23,100.19,102.02,99.59,99.81,99.86,99.6,100.35,99.38,100.83,99.73,98,99.72,101.34,98.77,99.94,99.47,99.95,100.33,99.57,100.82,100.23,100.68,101.64,100.86,99.28,101.41,100.21,101.85,101.43,103) lambda <- 0.2 center <- 100 sigma <- 1 k <- 2.859 # 手动计算EWMA统计量(可切换初始值:center或test[1]) n <- length(test) ewma_vals <- numeric(n) ewma_vals[1] <- test[1] # 改为center则匹配qcc默认初始值 for(i in 2:n) { ewma_vals[i] <- lambda * test[i] + (1 - lambda) * ewma_vals[i-1] } # 用qcc绘制EWMA图,传入手动计算的统计量 v <- ewma(ewma_vals, lambda = lambda, nsigmas = k, xlab="观测序号", ylab="EWMA", std.dev = sigma, center = center) # 叠加原始观测点 points(test, col = "red", pch = 16)
方法2:手动绘制完全自定义的EWMA图(推荐新手)
如果需要100%匹配示例图的样式,用ggplot2手动计算所有元素更灵活:
library(ggplot2) test <- c(100.23,100.19,102.02,99.59,99.81,99.86,99.6,100.35,99.38,100.83,99.73,98,99.72,101.34,98.77,99.94,99.47,99.95,100.33,99.57,100.82,100.23,100.68,101.64,100.86,99.28,101.41,100.21,101.85,101.43,103) lambda <- 0.2 center <- 100 sigma <- 1 k <- 2.859 n <- length(test) # 计算EWMA统计量 ewma_vals <- numeric(n) ewma_vals[1] <- center # 可改为test[1]切换初始值逻辑 for(i in 2:n) { ewma_vals[i] <- lambda * test[i] + (1 - lambda) * ewma_vals[i-1] } # 计算动态控制限 cl_lower <- center - k * sigma * sqrt(lambda/(2 - lambda) * (1 - (1 - lambda)^(2*(1:n)))) cl_upper <- center + k * sigma * sqrt(lambda/(2 - lambda) * (1 - (1 - lambda)^(2*(1:n)))) # 整理绘图数据 plot_df <- data.frame( index = 1:n, original = test, ewma = ewma_vals, lcl = cl_lower, ucl = cl_upper, center = rep(center, n) ) # 生成自定义图 ggplot(plot_df, aes(x = index)) + geom_line(aes(y = ewma), color = "#0072B2", linewidth = 1) + geom_point(aes(y = ewma), color = "#0072B2", size = 2) + geom_point(aes(y = original), color = "#D55E00", size = 1.5, alpha = 0.7) + geom_line(aes(y = lcl), color = "#E69F00", linetype = "dashed") + geom_line(aes(y = ucl), color = "#E69F00", linetype = "dashed") + geom_line(aes(y = center), color = "black") + labs(x = "观测序号", y = "EWMA/原始值") + theme_minimal() + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())
关键原理补充
EWMA控制限分为两种:
- 动态控制限:随观测次数
t变化,公式为 $\text{UCL/LCL} = \mu \pm k\sigma\sqrt{\frac{\lambda}{2-\lambda}(1-(1-\lambda)^{2t})}$ - 稳态控制限:当
t趋近无穷时的固定值,公式为 $\text{UCL/LCL} = \mu \pm k\sigma\sqrt{\frac{\lambda}{2-\lambda}}$
可根据示例图的控制限样式选择对应计算方式。
内容的提问来源于stack exchange,提问作者Arion
相关产品推荐
相关产品推荐

