精密度分析
分析目的
精密度(precision)评价同一测量系统在可重复条件下对同一样品测得结果之间的一致程度,
通常用标准差(SD)或变异系数(CV%)表示。CLSI EP05
将精密度按条件细分为批内(within-run)、
批间(between-run)和日间(between-day)等方差分量,并给出各分量的估计、置信区间以及用于判定
的可接受限。
本文演示如何使用 ivdtools 包的 precision()
建立精密度方差分量分析,完成异常值检查、正态性
评估、方差分量与置信区间估计、Sadler 精密度剖面拟合,并把结果重排为 EP05
风格的方差分量表。
示例数据为确定性的教学数据,仅用于演示分析流程;正式研究必须使用方案或标准预先规定的实验设计、
接受标准与分析参数。
::: cell
library(ivdtools)
library(readr)
:::
数据格式要求:
precision()最终调用VCA::anovaVCA(),要求普通
data.frame。用readr::read_csv()读入的是
tibble,因此本文统一先转为
data.frame,再把实验因子列(天、批、复孔等)转为因子。
函数概述
函数 主要用途 关键输入或输出
precision() 创建精密度方差分量分析对象 嵌套公式、by
分组、平衡性检查
outlier() 逐样本异常值检测 Grubbs 或 IQR 方法
normal() 逐样本正态性检验 Shapiro-Wilk 等,level
控制置信水平
variance() / vc() 估计方差分量 VC、%Total、SD、CV%,NegVC
在此传入
ci() 各分量 SD/CV 的置信区间 Satterthwaite 近似
profile() Sadler 精密度剖面拟合 10 个候选模型、AIC 选优
list_sadler() 查看 10 个 Sadler 模型 模型公式与类型
summary() / plot() 汇总与绘图 plot(type=...) 选择图形
precision() 创建对象后,分析结果通过
outlier()、normal()、variance()、ci()、profile()
逐步累积到对象中,必须重新赋值:
precision() -> outlier() -> normal() -> variance() -> ci() -> profile()
只有已执行的分析才出现在 summary() 中,且 plot()
的某些图形依赖前置分析。
示例一:EP05 20×2×2 单样本精密度
读取和核验数据
20×2×2 指 20 天、每天 2 批、每批 2 个重复,共 80 个结果,是 EP05
的经典设计之一:
::: cell
ep05 <- read_csv("./data/precision-ep05.csv", show_col_types = FALSE)
ep05 <- as.data.frame(ep05)
str(ep05)
:::
实验因子列在 CSV 中为整数,读取后转换为因子:
::: cell
ep05$day <- factor(ep05$day)
ep05$run <- factor(ep05$run)
ep05$rep <- factor(ep05$rep)
:::
::: cell
dim(ep05)
summary(ep05$value)
:::
value ~ day/run 表示方差分量按 日间(day)→ 日内的批(run)逐层嵌套。
/ 是嵌套记法,等价于把每个深一层因子视为上一层因子的分组内因子。
创建分析对象并预检
::: cell
p <- precision(ep05, value ~ day/run)
p
:::
平衡性检查输出提示最大/最小单元大小之比;当数据高度不平衡时,VCA
会提示改用 REML。
逐样本做异常值检测和正态性检验:
::: cell
p <- outlier(p, method = "grubbs")
:::
::: cell
p <- normal(p, method = "shapiro")
:::
参数说明:
outlier()的method可选"grubbs"(默认)或
"iqr",alpha为 Grubbs 显著性水平。normal()的method="auto"
会根据样本量选择检验(n≤50 用 Shapiro-Wilk、更大用 Anderson-Darling
等);指定method="shapiro"时输出的W列才是真正的 Shapiro-Wilk W
统计量。 单样本数据 n=80,两种方式均可接受,本示例显式指定以便展示。
方差分量与置信区间
::: cell
p <- variance(p)
:::
NegVC 参数需要在 variance() 处传入:
::: cell
p <- variance(p, NegVC = TRUE) # 允许负方差分量(默认 FALSE)
:::
::: cell
p <- ci(p)
:::
ci() 采用 Satterthwaite 有效自由度近似计算各分量 SD 与 CV 的置信区间。
转化为 EP05 术语表
按分量名的嵌套深度把方差分量归入批内、批间、日间,并计算总
SD/CV,进一步把各分量置信区间合并形成带区间的完整 EP05
报告表。统计结果是否可接受必须依据方案预先规定的精密度限值判定。
图形
散点图可用于快速识别测试异常和测值分布情况:
::: cell
plot(p, type = "dot")
:::
::: cell
plot(p, type = "qq")
:::
图形依赖:
plot(type="dot")
为按运行顺序的散点(无需前置分析),type="his"为标准直方图;
type="var"需要先执行variance(),type="qq"需要先执行
normal(),type="profile"需要先执行
profile()。绘图前请确认对应分析已运行。
::: cell
summary(p)
:::
示例二:多样本3×5与 Sadler 剖面
读取数据
当需要评价多个浓度水平时,用 by
指定样本分组列,各样本分别估计方差分量:
::: cell
profile_data <- as.data.frame(read_csv(
"./data/precision-profile.csv",
show_col_types = FALSE
))
profile_data$sample <- factor(profile_data$sample)
profile_data$day <- factor(profile_data$day)
profile_data$rep <- factor(profile_data$rep)
:::
样本方差分量
::: cell
p2 <- precision(profile_data, value ~ day, by = "sample")
p2 <- variance(p2)
:::
::: cell
p2 <- ci(p2)
:::
比较样本的变异比例,可用于产品优化和检验方案设计:
::: cell
plot(p2, type = "var")
:::
精密度剖面
profile() 对每个方差分量拟合 Sadler 模型族,按 AIC 选出最优模型:
::: cell
list_sadler()
:::
::: cell
p2 <- profile(p2, model.no = 1:10)
:::
::: cell
plot(p2, type = "profile")
:::
参数说明:
profile(model.no = 1:10)指定候选模型序号;...
可传给内部 Sadler 拟合(例如K)。 每个方差分量至少需要 3
个样本具有有限 SD 才能拟合,因此多样本设计至少应设 3 个浓度水平。
剖面可用于功能灵敏度等分析中预测任意浓度下的
SD/CV(参见《功能灵敏度》)。
本示例 total 与 day 分量最优模型为幂函数型(模型 7),day:rep 分量为恒定
CV 型(模型 2), 符合"SD 随浓度升高而增大、CV 相对稳定"的常见设定。
示例三:多样本多中心(站点)精密度
读取数据
数据包含 2 个站点(site)、3 个样本(sample),每站点每样本 3 天 × 3 批
× 5 复孔:
::: cell
sites_data <- as.data.frame(read_csv(
"./data/precision-sites.csv",
show_col_types = FALSE
))
sites_data[] <- lapply(sites_data, function(x)
if (is.numeric(x) && all(x == round(x))) factor(x) else x)
str(sites_data)
:::
多列分组
by 可接受多个列名,内部按交互作用分组,一次得到所有站点 × 样本组合:
::: cell
p3 <- precision(sites_data, value ~ day/run, by = c("sample", "site"))
p3 <- variance(p3)
names(p3$results)
:::
按站点拆分单独分析
等价的做法是先按站点
split(),再对每个站点子集执行相同的分析参数。当站点间的方差分量
结构预计不同,或需要分别出具报告时,拆分后单独分析更清晰:
::: cell
for (s in c("A", "B")) {
sub <- sites_data[sites_data$site == s, ]
ps <- precision(sub, value ~ day/run, by = "sample")
ps <- variance(ps)
ps <- ci(ps)
}
:::
注意:
多中心研究应统一分析方案、方差分量模型与报告口径;“先按中心出报告、再合并汇总”
时,务必记录每个中心的原始数据是否纳入、排除标准与因子定义是否一致。
示例四:自定义的更复杂模型
读取数据
除标准的天/批/重复嵌套外,precision() 的公式可以是任意 VCA
嵌套结构,例如再加入操作者
(operator)层:value ~ operator/day/run,即 操作者 → 天 → 批
逐层嵌套:
::: cell
custom_data <- as.data.frame(read_csv(
"./data/precision-custom.csv",
show_col_types = FALSE
))
custom_data[] <- lapply(custom_data, function(x)
if (is.numeric(x) && all(x == round(x))) factor(x) else x)
:::
拟合与解读
::: cell
p4 <- precision(custom_data, value ~ operator/day/run)
p4 <- variance(p4)
:::
结果判读要点
- 设计匹配:先明确研究设计的嵌套结构,
precision()
的公式要如实反映实验分层。 - 数据格式:
read_csv读取后转data.frame,因子列显式转
factor,避免 VCA 报错或歧义。 - 调用顺序:
outlier → normal → variance → ci → profile,每次分析重新赋值;绘图依赖前置分析。 - 负分量:某层因子水平过少或数据恰好相近时方差分量会被归零,需谨慎解释并在方案中规定处理方式。
- CI 适用性:Satterthwaite
近似在方差分量很少或不平衡时准确性下降,报告时注明方法。 - 术语表:把
$results的数值量(sd_comp/cv_comp/vc)重排为
EP05 术语表,不要直接使用 展示用字符串$vc。 - 可接受判定:统计估计不自动构成合格判定,应与预设精密度限值比较,并由专业人员复核。

1457

被折叠的 条评论
为什么被折叠?



