Constructing Pedigrees in R

Nov 14, 2011 · 2 min read
posts

I was looking for a good way to draw pedigrees using software, without having to fuss drawing them “by hand” using a drawing program. Lo and behold, I came across a few different packages in R that allow me to do just that!

pedigree

Using the kinship2 package, I was quickly able to produce a nice pedigree for a family with two genetic conditions: factor VIII deficiency (haemophilia) and myotonic dystrophy. Factor VIII deficiency is a classic example of a sex-linked recessive trait, and myotonic dystrophy follows autosomal dominant inheritance. In this pedigree, I show the status of affected and unaffected indiviudals (not carriers), using the following bits of code in R.

First, let’s install (if needed) and load the kinship2 package:

if (!require(kinship2)) {install.packages("kinship2"); library(kinship2)}

Now we need to code several variables which will correspond to all of the individuals in the pedigree. First, we need individual ID numbers:

ids <- 1:49

Second, we need to identify the father and mother of each individual using the individual ID numbers above:

dad <- c(41,41,41,NA,NA,41,43,43,4,6,6,NA,9,9,9,NA,11,11,NA,15,
		 15,19,45,45,45,45,45,45,45,47,NA,29,29,29,29,NA,31,31,31,36,
		 NA,NA,NA,NA,NA,NA,NA,NA,37)
mom <- c(42,42,42,NA,NA,42,44,44,5,7,7,NA,10,10,10,NA,12,12,NA,16,
		 16,18,46,46,46,46,46,46,46,48,NA,30,30,30,30,NA,32,32,32,35,
		 NA,NA,NA,NA,NA,NA,NA,NA,13)

Now we code the sex and status (0=alive, 1=dead) of each individual:

sexes <- c(1,1,1,1,2,1,2,2,1,2,1,2,2,1,1,2,1,2,1,1,1,1,2,2,2,1,1,1,1,
		   2,1,2,1,1,2,1,1,1,2,2,1,2,1,2,1,2,1,2,3)
dead <- c(0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
		  0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0)

Here is where we code the affected status of each individual (0=unaffected, 1=affected, NA=unknown). We need to bind these columns together in a matrix (you can have up to 4 traits; one per column):

F8 <- c(0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
		0,0,0,0,0,0,0,1,0,0,NA,NA,NA,NA,NA,NA,NA,NA,NA)
MD <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,NA,NA,NA,NA,NA,NA,NA,1,
		0,0,0,1,1,0,0,0,0,0,NA,NA,NA,NA,NA,NA,NA,NA,NA)
affect <- as.matrix(cbind(F8, MD))

And now we create the pedigree object and plot it:

family <- pedigree(id=ids, dadid=dad, momid=mom,
				   affected=affect, sex=sexes, status=dead)

plot.pedigree(family)

pedigree.legend(family, location="bottomright",
				labels=list("Factor VIII\nDeficiency", "Myotonic\nDystrophy"),
				cex=0.8, radius=0.3)

That’s the basics! Of course, with a large pedigree I expect this becomes a bit unruly, but for smaller examples like this one it’s relatively easy to put together.

Alex M Chubaty
Authors
Ecologist and simulation modeller

Dr. Chubaty is an ecologist and simulation modeller who builds spatial models of forest landscapes and the species that live in them. He completed his PhD at Simon Fraser University modelling host selection in mountain pine beetle (MPB), followed by postdoctoral research at Université Laval and Natural Resources Canada developing forecasting models of MPB spread.

He runs FOR-CAST Research & Analytics in Calgary, Canada. His recent work includes LANDIS-II forest landscape simulation studies, landscape connectivity modelling, and analyses of insect outbreak dynamics, to inform land management and species-at-risk decisions. He writes open-source R packages for this work, including grainscape for connectivity analysis, landisutils for LANDIS-II simulations, and co-developed the SpaDES simulation platform. He advocates for open data and reproducible workflows.