使用R的kinship2包绘制多家庭系谱树时遇“Impossible tree”错误求助
解决kinship2绘制系谱树时的"Impossible tree"错误
出现这个错误通常是因为系谱数据格式不符合kinship2的要求,结合你的数据和代码,主要问题及修复方案如下:
核心问题分析
- 家庭ID(FAMID)缺失:CSV中同一家庭的后续行FAMID为空,读取后变为NA,导致
kinship2无法区分独立家庭的系谱关系。 - 个体顺序错误:父母个体的行出现在子女之后(比如F0002中Q1是C5/C6的父亲,但Q1的行在子女之后),构建系谱时程序无法提前识别父母信息。
- 空值未正确转换:MO/FA列的空单元格被读为空字符串
"",而kinship2需要用NA表示无父母,空字符串会被当作无效ID处理。 - 多家庭未分组:直接用所有数据构建单个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
相关产品推荐
相关产品推荐

