tidypptsda 速查表

种猪性能测定站(NEDAP / FIRE)数据:体重清洗 → 日增重 ADG → 日采食 ADFI → 料肉比 FCR

read_station()读取导出文件
→
prep_visits()标准访问表
→
clean_weight()体重质控
→
calc_adg()补齐体重 + ADG
→
calc_adfi()校正、补齐采食
→
calc_fcr()FCR + 可信度
→
plot_* / write_results() / write_report()出图、导出、HTML 报告
一步到位:run_pipeline();全部阈值:qc_config()

安装与一次跑完

# install.packages("pak")
pak::pak("tony2015116/tidypptsda")
library(tidypptsda)

raw <- read_station("导出/", station = "nedap")
res <- run_pipeline(raw)            # 或 run_pipeline(nedap)
res$fcr$per_pig                     # 最终结果表
res$removed                         # 被剔除的猪及原因
write_results(res, dir = "结果", farm = "A01")
write_report(res, "结果/报告")       # HTML:每站一页,方向键翻页

示例数据:nedap、fire(测定站原始导出格式)。

读取数据 read_station() / station_format()

# 整个文件夹;不写 station 时自动判断类型
read_station("导出/", station = "nedap")
read_station(c("101.xlsx", "102.xlsx"), station = "fire")
# 列名对不上时:导出模板,改 column 列后再读
station_format("fire", file = "fire_format.txt")
read_station("导出/", station = "fire",
             format = "fire_format.txt")
类型必需字段
NEDAPresponder, location, entry_time, feed_intake, weight
FIRE同上 + exit_time, trough_in, trough_out

访问表与品种 prep_visits() / add_breed()

visits <- prep_visits(raw)
visits <- add_breed(visits, read.csv("品种表.csv"),
                    id = "耳标", breed = "品种")

质控参数 qc_config()

qc <- qc_config(stage_range = c(60, 120),
                curve_model = "poly1")
qc                          # 按组打印全部 43 个参数
run_pipeline(raw, qc = qc)
参数默认作用
stage_range30–120ADG / ADFI / FCR 的体重区间
weight_range15–150单条体重有效范围
adapt_days7进站适应期,体重不用
weight_outlierrlm, loess追踪后的异常值方法
min_test_days35最短测定期(剔除)
curve_modelpoly2区间两端体重的填充曲线
impute_methodloess_pop采食填充:群体曲线 × 个体比例;或 loess_lm、linear
curve_extrapstart记录外推:开头切线、末端曲线;或 curve、tangent
max_edge_extrap_days15两端填充超过即低可信度
duration_max3600单次访问时长上限(s)

参数名写错会提示最接近的名字;结果的 $settings 保存所用设置。

体重清洗 clean_weight()

按顺序:体重范围 → 适应期 → 逐日回溯追踪(从末期往前,只留衔接的读数)→ 二次稳健回归 rlm(权重 < 0.5)+ LOESS(偏离 > 3 MAD)。

qc_flag含义
""正常
weight_range超出 15–150 kg
adaptation进站后 7 天内
track追踪时不衔接(多为几头小猪同时上秤)
rlm / loess被相应方法判为异常
status条件
removed有效记录 < 20、测定期 < 35 天、缺失率 > 30%
low_confidence进站 > 65 kg、出栏 < 85 kg、追踪剔除 > 40%、LOESS R² < 0.99
keep通过

看结果:w$per_pig(每头猪)、w$records(每条记录)。

日增重 calc_adg()

  1. 生长曲线定区间:首次到达上限为终点,此前最后一次越过下限为起点。
  2. 补齐区间每天的体重 weight_filled:
source来源
observed当天有效体重的中位数
interpolated两个有记录日之间:线性插值
curve首个记录前:切线;末个记录后:生长曲线(curve_extrap)

3. ADG = 区间内全部日体重对日期回归的斜率(g/d),附 r_squared。

adg_type含义
observed区间两端都在测定期内
extrapolated需外推,不超过 30 天
partial外推仍到不了端点,只算覆盖段
none覆盖不足 7 天,无 ADG

日采食 flag_feed_errors() / calc_adfi()

state这一天的采食来自
org记录值,当天无错误访问
corr模型校正值
iii中间缺失:≤ 3 天 LOESS,> 3 天群体曲线 × 个体比例
elrp区间开头:群体曲线 × 个体比例;末端:单猪回归
missing无法估计

ADFI = 区间内日采食的平均值;coverage = 有实测(含校正)的天数比例。

料肉比 calc_fcr()

FCR = ADFI ÷ ADG,gf = ADG ÷ ADFI。fcr_flag 为 ok 或 low_confidence,原因写在 fcr_note:

分段明细:fcr$by_bin;汇总:fcr$summary(all / ok / 各品种)。育种评估优先用 fcr_flag == "ok" 的个体。

生长曲线图 plot_adg(adg, weight = w)

浅灰小点有效的原始体重记录
×深灰小叉被剔除的记录(原因见 qc_flag)
蓝点实测日体重
橙黄点线性插值的日体重
紫红点生长曲线填充的日体重
绿线 + 浅绿带生长曲线及约 95% 范围
黑色长虚线ADG 回归线(斜率即 ADG)
灰色水平虚线区间上下限

采食量图 plot_adfi(adfi)

浅灰点记录的日采食(未校正)
蓝点无错误,直接使用(org)
橙点校正值(corr)
绿点中间填充(iii)
紫红点两端填充(elrp)
灰色水平虚线这头猪的 ADFI
g <- plot_adg(res$adg, weight = res$weight,
              locations = "101")
g$plot[[1]]                     # 第一个测定站
h <- plot_adfi(res$adfi)
save_plots(g, "图", suffix = "growth")

导出 write_results()

文件名为 场名_内容_日期.csv,UTF-8 带 BOM(Excel 直接打开不乱码)。

文件内容
fcr每头猪 ADG、ADFI、FCR 和可信度
by_bin每个体重段的采食、增重、分段料肉比
daily_weight每天的体重(实测、填充、曲线)
daily_feed每天的采食(记录、校正、填充)
weight_pigs每头猪的体重质控结果
feed_model / summary校正模型系数 / 汇总统计
removed / settings剔除的猪及原因 / 所用参数

方法验证 在自己的数据上检验

函数检验
validate_outliers()加入人为误差,比较异常值方法的检出率、误删率和 ADG 误差;干净记录取各方法的共识
validate_adg()生长曲线的分块交叉验证(block_days)与截断(晚进站、早出栏);extrap 比较曲线与切线外推
validate_weight_fill()隐藏日体重,比较线性插值与各曲线的填充误差
validate_adfi()隐藏日采食,比较 loess_pop、loess_lm、linear;传入 weight 时体重也重新计算
validate_truncation()整条流程:截断部分猪的全部访问后重跑,比较多套设置的 ADG / ADFI / FCR(无泄露,最接近实际)
vw <- validate_weight_fill(w, max_pigs = 300, cores = 4)
vw$summary
# 场景:random30 / blocks3 / late20 / early15
# 隐藏的日子先删掉再清洗,不泄露(1.5.0 起)
vf <- validate_adfi(f, weight = w)

常见情景

# 晚进站(45–60 kg 进站)
qc_config(stage_range = c(60, 120), curve_model = "poly1")
# 115 kg 左右出栏
qc_config(stage_range = c(30, 110))
# 计划测定 50 天
qc_config(min_test_days = 30)
# 单次采食上限随体重变化 + 分段料肉比检查
qc_config(fiv_max_by_weight = fiv_max_example(),
          bin_fcr_limits = bin_fcr_example())
# 上千头猪:并行
run_pipeline(raw, cores = 4)
# 只看某站、某几头猪
plot_adg(res$adg, locations = "101", responders = c("13913"))