mintab吧 关注:18贴子:6
  • 2回复贴,共1
求助

mintab中组内标准差是怎么计算的

只看楼主收藏回复

求大佬


IP属地:江苏来自Android客户端1楼2023-02-02 14:20回复
    标准差 组间/组内基于以下四个标准差:
    1. 子组内标准差 σ组内
    σ组内是子组内变异的估计值(例如,一个班次、一个操作员或一个材料批次)。Minitab 使用以下方法之一估计 σ组内:
    1.1 合并标准差:
    注意: 如果更改默认方法并且选择不使用无偏常量,则用 Sp 估计 σ组内。
    说明:
    d: Sp= Σ (ni- 1) 的自由度; Xij: 第 i 个子组中的第 j 个观测值; X̅i: 第 i 个子组的均值;
    ni :第 i 个子组中的观测值个数; C4(d+1): 无偏常量; Γ(.): Gamma 函数。
    1.2 子组极差平均值 (Rbar):
    说明:
    ri: 第 i 个子组的极差; d2 (ni): 从表中读取的无偏常量(有关详细信息,请参见“无偏常量 d2()、d3() 和 d4()”部分); d3 (ni): 从表中读取的无偏常量(有关详细信息,请参见“无偏常量 d2()、d3() 和 d4()”部分); ni: 第 i 个子组中的观测值个数 。
    1.3 子组标准差平均值 (Sbar):
    注意: 如果更改默认设置并且不使用无偏常量,则用 Σ Si/子组数来估计 σ组内。
    说明: C4(ni) 无偏常量(如为合并标准差所定义)。 Si: 子组 i 的标准差; ni: 第 i 个子组中的观测值个数。
    2. 子组间标准差 σ组间
    σ组间是子组间变异的估计值(例如,在设定的区间、批次中收集的子组,或由不同的操作员收集的子组)。
    σ2Xbar 使用以下方法之一进行估计:
    2.1 移动极差平均值:
    说明:
    Ri: 第 i 个移动极差; w: 在移动极差中使用的观测值个数;默认值为 w = 2; d2(w) :从表中读取的无偏常量(有关详细信息,请参见“无偏常量 d2()、d3() 和 d4()”部分)。
    2.2 移动极差中位数:
    说明:
    MRi: 第 i 个移动极差; MRi: 的中位数 w 在移动极差中使用的观测值个数;默认值为 w = 2; d4(w): 从表中读取的无偏常量(有关详细信息,请参见“无偏常量 d2()、d3() 和 d4()”部分)。
    2.3 递差均方和平方根 (MSSD):
    3. 组间/组内标准差
    4. 整体标准差
    注意: 默认情况下,Minitab 在估计 σ整体 时不使用无偏常量。σ整体 用 S 来估计。如果要使用无偏常量来估计整体标准差,则可以在执行能力分析时更改估计子对话框上的此选项。如果希望 Minitab 始终默认使用无偏常量,请选择工具 > 选项 > 控制图和质量工具 > 估计标准差,然后选择适当的选项。
    说明:
    Xij: 第 i 个子组中的第 j 个观测值; X̅: 过程均值; ni: 第 i 个子组中的观测值个数;
    C4 (N): 无偏常量(如为合并标准差所定义); N(或 Σ ni): 观测值总数。
    以上就是组间/组内标准差的一些算法。


    来自iPhone客户端2楼2023-02-03 11:51
    回复
      #include <iostream>
      #include <vector>
      #include <cmath>
      #include <numeric>
      #include <algorithm>
      // 计算单个子组的均值
      double calculateMean(const std::vector<double>& subgroup) {
      double sum = std::accumulate(subgroup.begin(), subgroup.end(), 0.0);
      return sum / subgroup.size();
      }
      // 计算单个子组的标准差
      double calculateStandardDeviation(const std::vector<double>& subgroup) {
      double mean = calculateMean(subgroup);
      double sum = 0.0;
      for (double value : subgroup) {
      sum += std::pow(value - mean, 2);
      }
      return std::sqrt(sum / (subgroup.size() - 1));
      }
      // 计算合并标准差(Sp)
      double calculateCombinedStandardDeviation(const std::vector<std::vector<double>>& subgroups) {
      double sumSquares = 0.0;
      int totalDegreesOfFreedom = 0;
      for (const auto& subgroup : subgroups) {
      double subgroupStdDev = calculateStandardDeviation(subgroup);
      sumSquares += (subgroup.size() - 1) * std::pow(subgroupStdDev, 2);
      totalDegreesOfFreedom += (subgroup.size() - 1);
      }
      return std::sqrt(sumSquares / totalDegreesOfFreedom);
      }
      // 计算子组的极差
      double calculateRange(const std::vector<double>& subgroup) {
      auto minMax = std::minmax_element(subgroup.begin(), subgroup.end());
      return *minMax.second - *minMax.first;
      }
      // 计算子组间标准差(σ组间)— 以极差为例
      double calculateBetweenGroupStdDev(const std::vector<std::vector<double>>& subgroups) {
      std::vector<double> ranges;
      for (const auto& subgroup : subgroups) {
      ranges.push_back(calculateRange(subgroup));
      }
      double meanRange = calculateMean(ranges);
      double sumSquares = 0.0;
      for (double range : ranges) {
      sumSquares += std::pow(range - meanRange, 2);
      }
      return std::sqrt(sumSquares / (ranges.size() - 1));
      }
      int main() {
      // 给定的子组数据
      std::vector<std::vector<double>> subgroups = {
      {3.08, 3.09, 3.1, 3.09, 3.15, 3.11, 3.1, 3.09, 3.11, 3.15},
      {3.12, 3.09, 3.11, 3.11, 3.1, 3.09, 3.11, 3.08, 3.09, 3.06},
      {3.09, 3.1, 3.12, 3.08, 3.13, 3.1, 3.1, 3.09, 3.11, 3.08},
      {3.06, 3.09}
      };
      // 计算子组内标准差(σ组内)—— 使用合并标准差
      double sigmaWithin = calculateCombinedStandardDeviation(subgroups);
      std::cout << "子组内标准差 (σ组内): " << sigmaWithin << std::endl;
      // 计算子组间标准差(σ组间)—— 使用极差
      double sigmaBetween = calculateBetweenGroupStdDev(subgroups);
      std::cout << "子组间标准差 (σ组间): " << sigmaBetween << std::endl;
      return 0;
      }


      IP属地:江苏3楼2024-12-11 19:12
      回复