You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R的kinship2包绘制多家庭系谱树时遇“Impossible tree”错误求助

解决kinship2绘制系谱树时的"Impossible tree"错误

出现这个错误通常是因为系谱数据格式不符合kinship2的要求,结合你的数据和代码,主要问题及修复方案如下:

核心问题分析

  1. 家庭ID(FAMID)缺失:CSV中同一家庭的后续行FAMID为空,读取后变为NA,导致kinship2无法区分独立家庭的系谱关系。
  2. 个体顺序错误:父母个体的行出现在子女之后(比如F0002中Q1是C5/C6的父亲,但Q1的行在子女之后),构建系谱时程序无法提前识别父母信息。
  3. 空值未正确转换:MO/FA列的空单元格被读为空字符串"",而kinship2需要用NA表示无父母,空字符串会被当作无效ID处理。
  4. 多家庭未分组:直接用所有数据构建单个pedigree对象,kinship2无法处理多个独立的家庭系谱。

修正后的代码及步骤

library(kinship2)
library(tidyr)

# 读取数据,避免自动转换因子
pedigree_data <- read.csv("CHS_Pedigree_new.csv", stringsAsFactors = FALSE)
colnames(pedigree_data) <- toupper(colnames(pedigree_data))

# 1. 填充FAMID缺失值:同一家庭的个体统一归属
pedigree_data <- fill(pedigree_data, FAMID, .direction = "down")

# 2. 将MO/FA列的空字符串转为NA(表示无父母)
pedigree_data$MO[pedigree_data$MO == ""] <- NA
pedigree_data$FA[pedigree_data$FA == ""] <- NA

# 3. 调整个体顺序:每个家庭中无父母的个体(祖先)优先出现
pedigree_data <- pedigree_data %>%
  group_by(FAMID) %>%
  arrange(is.na(MO) & is.na(FA), .by_group = TRUE) %>%
  ungroup()

# 4. 构建带家庭分组的系谱对象
pedigree <- pedigree(
  id = pedigree_data$ID, 
  momid = pedigree_data$MO, 
  dadid = pedigree_data$FA, 
  sex = pedigree_data$SEX,
  family = pedigree_data$FAMID
)

# 绘制单个家庭的系谱树
plot(pedigree, family = "F0001", main = "F0001 家庭系谱")

# 批量绘制所有家庭的系谱树
for(fam_id in unique(pedigree_data$FAMID)){
  plot(pedigree, family = fam_id, main = paste(fam_id, "家庭系谱"))
}

关键修复点说明

  • FAMID填充:确保每个个体都有明确的家庭归属,kinship2才能正确区分独立的系谱树。
  • 空值转换:NA是kinship2认可的"无父母"标记,空字符串会被视为无效ID,导致无法找到对应个体。
  • 顺序调整:必须先定义祖先(无父母的个体),再定义后代,否则程序会因找不到父母信息而报错。
  • 家庭分组:通过family参数告诉kinship2哪些个体属于同一家庭,支持同时处理多个独立系谱。

内容的提问来源于stack exchange,提问作者sai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:56:09