diff --git a/capabilities.json b/capabilities.json index c302be4..f4ffbd7 100644 --- a/capabilities.json +++ b/capabilities.json @@ -38,7 +38,8 @@ "enumeration" : [ { "displayName" : "run - Run Chart", "value" : "run" }, { "displayName" : "i - Individual Measurements", "value" : "i" }, - { "displayName" : "i_m - Individual Measurements (Median centerline)", "value" : "i_m" }, + { "displayName" : "i_m - Individual Measurements: Median centerline", "value" : "i_m" }, + { "displayName" : "i_mm - Individual Measurements: Median centerline, Median MR Limits", "value" : "i_mm" }, { "displayName" : "mr - Moving Range of Individual Measurements", "value" : "mr" }, { "displayName" : "p - Proportions", "value" : "p" }, { "displayName" : "p prime - Proportions: Large-Sample Corrected", "value" : "pp" }, diff --git a/pbiviz.json b/pbiviz.json index 31ea8b5..9419718 100644 --- a/pbiviz.json +++ b/pbiviz.json @@ -4,7 +4,7 @@ "displayName":"SPC Charts", "guid":"PBISPC", "visualClassName":"Visual", - "version":"1.4.3.3", + "version":"1.4.3.4", "description":"A PowerBI custom visual for SPC charts", "supportUrl":"https://github.com/AUS-DOH-Safety-and-Quality/PowerBI-SPC", "gitHubUrl":"https://github.com/AUS-DOH-Safety-and-Quality/PowerBI-SPC" diff --git a/src/Classes/derivedSettingsClass.ts b/src/Classes/derivedSettingsClass.ts index e00209d..8e14d5c 100644 --- a/src/Classes/derivedSettingsClass.ts +++ b/src/Classes/derivedSettingsClass.ts @@ -3,6 +3,7 @@ import { defaultSettingsType } from "./settingsClass" const valueNames: Record = { "i": "Observation", "i_m": "Observation", + "i_mm": "Observation", "c": "Count", "t": "Time", "xbar": "Group Mean", @@ -53,7 +54,7 @@ export default class derivedSettingsClass { this.chart_type_props = { needs_denominator: ["p", "pp", "u", "up", "xbar", "s"].includes(chartType), - denominator_optional: ["i", "i_m", "run", "mr"].includes(chartType), + denominator_optional: ["i", "i_m", "i_mm", "run", "mr"].includes(chartType), numerator_non_negative: ["p", "pp", "u", "up", "s", "c", "g", "t"].includes(chartType), numerator_leq_denominator: ["p", "pp", "u", "up"].includes(chartType), has_control_limits: !(["run"].includes(chartType)), diff --git a/src/Limit Calculations/i_m.ts b/src/Limit Calculations/i_m.ts index 142da9a..7658a67 100644 --- a/src/Limit Calculations/i_m.ts +++ b/src/Limit Calculations/i_m.ts @@ -1,4 +1,4 @@ -import { abs, diff, divide, rep, median } from "../Functions"; +import { abs, diff, divide, rep, median, mean } from "../Functions"; import { type controlLimitsObject, type controlLimitsArgs } from "../Classes"; export default function imLimits(args: controlLimitsArgs): controlLimitsObject { @@ -10,11 +10,11 @@ export default function imLimits(args: controlLimitsArgs): controlLimitsObject { const cl: number = median(ratio); const consec_diff: number[] = abs(diff(ratio)); - const consec_diff_ulim: number = median(consec_diff) * 3.267; + const consec_diff_ulim: number = mean(consec_diff) * 3.267; const outliers_in_limits: boolean = args.outliers_in_limits; const consec_diff_valid: number[] = outliers_in_limits ? consec_diff : consec_diff.filter(d => d < consec_diff_ulim); - const sigma: number = median(consec_diff_valid) / 1.128; + const sigma: number = mean(consec_diff_valid) / 1.128; return { keys: args.keys, diff --git a/src/Limit Calculations/i_mm.ts b/src/Limit Calculations/i_mm.ts new file mode 100644 index 0000000..142da9a --- /dev/null +++ b/src/Limit Calculations/i_mm.ts @@ -0,0 +1,32 @@ +import { abs, diff, divide, rep, median } from "../Functions"; +import { type controlLimitsObject, type controlLimitsArgs } from "../Classes"; + +export default function imLimits(args: controlLimitsArgs): controlLimitsObject { + const useRatio: boolean = (args.denominators && args.denominators.length > 0); + const ratio: number[] = useRatio + ? divide(args.numerators, args.denominators) + : args.numerators; + + const cl: number = median(ratio); + + const consec_diff: number[] = abs(diff(ratio)); + const consec_diff_ulim: number = median(consec_diff) * 3.267; + const outliers_in_limits: boolean = args.outliers_in_limits; + const consec_diff_valid: number[] = outliers_in_limits ? consec_diff : consec_diff.filter(d => d < consec_diff_ulim); + + const sigma: number = median(consec_diff_valid) / 1.128; + + return { + keys: args.keys, + values: ratio.map(d => isNaN(d) ? 0 : d), + numerators: useRatio ? args.numerators : undefined, + denominators: useRatio ? args.denominators : undefined, + targets: rep(cl, args.keys.length), + ll99: rep(cl - 3 * sigma, args.keys.length), + ll95: rep(cl - 2 * sigma, args.keys.length), + ll68: rep(cl - 1 * sigma, args.keys.length), + ul68: rep(cl + 1 * sigma, args.keys.length), + ul95: rep(cl + 2 * sigma, args.keys.length), + ul99: rep(cl + 3 * sigma, args.keys.length) + }; +} diff --git a/src/Limit Calculations/index.ts b/src/Limit Calculations/index.ts index 1323443..dcef923 100644 --- a/src/Limit Calculations/index.ts +++ b/src/Limit Calculations/index.ts @@ -2,6 +2,7 @@ export { default as c } from "./c" export { default as g } from "./g" export { default as i } from "./i" export { default as i_m } from "./i_m" +export { default as i_mm } from "./i_mm" export { default as mr } from "./mr" export { default as p } from "./p" export { default as pp } from "./pprime" diff --git a/src/defaultSettings.ts b/src/defaultSettings.ts index 527fde0..4000e53 100644 --- a/src/defaultSettings.ts +++ b/src/defaultSettings.ts @@ -42,7 +42,7 @@ const defaultSettings = { right_padding: { default: 10 } }, spc: { - chart_type: { default: "i", valid: ["run", "i", "i_m", "mr", "p", "pp", "u", "up", "c", "xbar", "s", "g", "t"] }, + chart_type: { default: "i", valid: ["run", "i", "i_m", "i_mm", "mr", "p", "pp", "u", "up", "c", "xbar", "s", "g", "t"] }, outliers_in_limits: { default: false }, multiplier: { default: 1, valid: { numberRange: { min: 0 } } }, sig_figs: { default: 2, valid: { numberRange: { min: 0, max: 20 } } },