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, simulation modeller, and co-developer of the open source SpaDES simulation platform. He completed his PhD at Simon Fraser University modelling host selection in mountain pine beetle (MPB), and postdoctoral research at Université Laval and Natural Resources Canada developing forecasting models of MPB spread.

He currently operates FOR-CAST Research & Analytics in Calgary, Canada, which supports the development and integration of models simulating forest vegetation dynamics, wildfire, insect disturbance, and wildlife populations to inform decision making for land management and species at risk. He is an advocate for open source, open data, and reproducible workflows.