安装与一次跑完
# 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")
- 支持 CSV、TXT(分隔符自动识别)和 Excel(需 readxl)。
- 列名和内置格式一致时不需要格式文件;对不上时会报错并列出缺哪些列。
- 格式文件每行一个字段:
field、column(列名或位置,日期,时间 合并两列,- 表示没有)、unit(kg / g / auto,s / min)。
- 读出来是统一的标准表:耳标、站号为文本;时间为 POSIXct;采食、料槽重为 g,体重为 kg,停留时间为 s。
| 类型 | 必需字段 |
| NEDAP | responder, 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 = "品种")
- 未识别耳标的访问保留为
identified = FALSE(采食错误判定要用)。
- 跨站的猪:各站记录都保留(可转回原站);夹在另一站中间的 ≤ 2 次零星访问视为误读,转为未识别访问;中断 > 3 天或转栏体重跳变 > 10 kg 降级。见
attr(visits, "stations")。
- 有品种列后:校正模型加品种效应,
fcr$summary 按品种分组。
质控参数 qc_config()
qc <- qc_config(stage_range = c(60, 120),
curve_model = "poly1")
qc # 按组打印全部 43 个参数
run_pipeline(raw, qc = qc)
| 参数 | 默认 | 作用 |
stage_range | 30–120 | ADG / ADFI / FCR 的体重区间 |
weight_range | 15–150 | 单条体重有效范围 |
adapt_days | 7 | 进站适应期,体重不用 |
weight_outlier | rlm, loess | 追踪后的异常值方法 |
min_test_days | 35 | 最短测定期(剔除) |
curve_model | poly2 | 区间两端体重的填充曲线 |
impute_method | loess_pop | 采食填充:群体曲线 × 个体比例;或 loess_lm、linear |
curve_extrap | start | 记录外推:开头切线、末端曲线;或 curve、tangent |
max_edge_extrap_days | 15 | 两端填充超过即低可信度 |
duration_max | 3600 | 单次访问时长上限(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()
- 生长曲线定区间:首次到达上限为终点,此前最后一次越过下限为起点。
- 补齐区间每天的体重
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()
- 错误判定:Casey 等(2005)16 条规则(单次采食量、停留时间、采食速度、料槽重差…),
calc_adfi() 内部自动调用。
- 校正:Jiao 等(2014)混合模型,扣除错误协变量的影响;无错误的日子不变。
- 补齐:只在 ADG 的同一区间内;体重用补齐后的日体重。长缺口和开头:全群(或品种)"采食 ~ 体重"曲线 × 个体采食水平(
adfi$pop_curve);末端:这头猪自己的回归。详见文章《填充方法》。
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:
- 体重或采食在区间两端填充超过 15 天;
- 有实测采食的天数不足 70%;
- 中间某个 10 kg 段实测体重覆盖不足 6 kg;
- ADG 只覆盖区间一部分,或体重数据已降级;
- 可选:分段料肉比超出
bin_fcr_limits。
分段明细: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"))
- 区间下限宜比典型进站体重高 5–10 kg,上限宜比典型出栏体重低约 5 kg。
- 同一育种群体固定使用同一套参数,年度之间才可比。