New function avuncularPed()
for creating aunt/uncle
- nephew/niece pedigrees.
New function addAllele()
for extending the allele
set of a marker.
addSon()
and addDaughter()
are now more
flexible. The previous argument parent
has been renamed to
parents
and accepts one or two parents in any
order.
mergePed()
has been overhauled. In particular the
new argument by
makes it much more user friendly.
setAfreq()
gains argument
strict
.
Minor improvements of README and vignette.
Fixed bug in setGenotype()
when setting multiple
markers.
Fixed bug ignoring alleles in
distributeMarkers()
.
pedtools now depends on R 4.1 (or later) because
of the pipe operator |>
.
New function setSNPs()
for creating and attaching a
set of SNP markers with given positions and allele frequencies.
New function distributeMarkers()
for creating and
attaching equal markers evenly across a set of chromosomes (by default,
the human autosomes).
New function halfSibTriangle()
implementing an
interesting breeding pattern.
transferMarkers()
now ignores members of unknown sex
when checking compatibility.
Fixed bug in addMarker()
when input is a list of
pedigrees.
Fixed glitches in setMap()
.
Various improvements in code and docs.
Added many tests.
Rewrite README example to show piping.
The main theme of this version is to make pedtools
more
adapted to piping, e.g., allowing chains of commands like
nuclearPed() |> addSon(1) |> addMarker(alleles = 1:2)
.
New functions setAfreq()
, setChrom()
,
setGenotype()
, setMarkername()
,
setPosition()
for modifying marker attributes. These are
alternatives to the previous in-place modifiers
afreq<-()
a.s.o..
New function addMarker()
which simplifies that
common task of creating and attaching a single marker. The command
addMarker(x, ...)
is equivalent to
addMarkers(x, marker(x, ...))
.
The new addMarker()
accepts ped lists, so that one
can write
e.g. list(singleton(1), singleton(2)) |> addMarker("1" = "a/b", alleles = c("a", "b"))
readPed()
gains the argument colSep
,
which fixes the previous inability to handle names with spaces.
New function descentPaths()
, mostly intended for use
in other ped suite packages.
relabel(x, new = "generations")
now gives automatic,
generation-aware labelling: I-1, I-2, II-1, …
generations()
gains argument maxOnly
,
by default TRUE. If FALSE, the function returns the generation number of
each individual.
New function generations()
for counting generations
in pedigrees.
New function newMarker()
(mostly for internal
use).
plot.ped()
gains a new parameter
twins
.
father()
and mother()
now accepts ped
lists as input.
Added info and links to ped suite in README.
Fixed bug in getGenotypes()
affecting pedigrees with
numerical labels.
Fixed bug in doubleCousins()
.
cousins()
(not to be confused
with cousinPed()
) is temporarily retracted, since it did
not work as intended.New constructor newPed()
(mainly for internal
use).
New function foundersFirst()
, moved from the
ribd package.
In addChildren()
, unspecified nch
is
now allowed, and defaults to length(ids)
or
length(sex)
.
transferMarkers()
has a new argument
checkSex()
, and has been made more efficient by skipping
redundant validation steps.
The functions swapSex()
, alleles()
and
internalID()
now work for lists of pedigrees.
getComponent()
gained a new argument
errorIfUnknown()
.
unrelated()
and siblings()
have been
improved and cleaned of bugs.
Fixed an obscure bug in plot.singleton()
.
getMap(na.action = 1)
is re-implemented and now
behaves slightly differently. (This was necessary to improve the
handling of linked markers in pedprobr::merlin()
.)
The order of individuals in linearPed()
now always
follows the “asPlot” pattern, as for the other basic pedigrees. (Missed
this in the previous version.)
plot.ped()
gains arguments textInside
,
textAbove
and carrier
.
transferMarkers()
has new arguments
fromIds
and toIds
enabling transfer between
differently-named individuals.
In setMarkers()
and friends, the shortcut
locusAttributes = "snp-12"
may be used to indicate that all
supplied markers are SNPs with alleles 1 and 2. Further shortcuts are
“snp-ab” and “snp-AB”.
setMap()
is extended to ped lists.
Built-in pedigree structures are now labelled according to
default plotting order. In particular, this means that pedigrees made by
halfSibPed()
, cousinPed()
and
halfCousinPed()
are ordered differently than
before.
In plot.ped()
, the parameter
skipEmptyGenotypes
is replaced by showEmpty
,
with default value FALSE
.
Function xxxFrequencyDatabase()
have been renamed to
xxxFreqDatabase()
The marker attribute posCm
has been removed, to
avoid confusion with the physical position.
marker()
now checks for duplicated allele
labels.
setMarkers()
now checks for duplicated marker names
(and allele labels, through marker()
; see previous
point).
readPed()
and friends now automatically recognises
allele separator “/” when genotypes are written like “a/b”. Other
separators must be indicated with sep
as before, e.g.,
readPed(..., sep = ",")
.
New function getGenotypes()
, which is similar to
getAlleles()
, but returns a matrix of genotypes written as
“a/b”.
More flexible conversion of pedigrees to data frames, with new
arguments sep
and missing
in
as.data.frame.ped()
.
New function setMap()
, facilitating setting
chromosome and physical position attributes.
marker()
has a new argument geno
,
allowing commands like
marker(nuclearPed(1), geno = c("a/a", NA, "a/b"))
.
print.marker()
has been overhauled and gives a more
coherent output.
halfSibPed()
has a new argument type
,
either “paternal” (default) or “maternal”.
reorderPed()
by default orders by numerical value,
if all labels are numeric.
plot.ped()
has a new argument hint
,
which is forwarded to kinship2::plot.pedigree()
. This is
necessary in some cases where the automatic plotting fails to give a
nice pedigree. An example is given in ?plot.ped
.
plot.ped()
gains argument hatched
,
which will eventually replace shaded
.
Added default values allows executing singleton()
and nuclearPed()
with no input.
Parts of plotPedList()
have been restructured. In
particular, the new argument groups
makes it easier to
control grouping and frames. Previous argument frametitles
has been renamed to titles
, because it also works without
frames.
The plot.ped()
argument id.labels
is
now deprecated in favour of the new labs
. This works
almost as before, with some exceptions documented here. The
labs
argument should be thought of as who should be
labelled rather than what are the labels. For example,
with x = singleton(1)
, the previous
plot(x, id.labels = "2")
would rename the singleton to “2”.
In contrast, plot(x, labs = "2")
will not show any label
(since x
doesn’t have a member named “2”). In general
intersect(labs, labels(x))
determines who gets a label.
Another change is that if labs
is a function, it is now
applied to the pedigree x
, not to labels(x)
.
This makes it very easy to apply standard pedigree functions like
females()
, nonfounders()
and
typedMembers()
, since they can be referred to simply by
name: plot(x, labs = females)
.
The implementation of doubleCousins()
is improved,
and some edge cases smoothed out, but the final ordering of individuals
may be different in some cases now.
writePed()
has been partially rewritten, to make it
more similar to readPed()
. By default, only the “ped” file
is written. New logical arguments “famid” and “header” provide further
control of this file.
Writing files in merlin format (indicated by
merlin = TRUE
) is internally now done in a separate
function. This option is rarely needed by end users, but is called by
e.g. pedprobr::likelihoodMerlin()
.
Genotype assignment in marker()
is more
user-friendly now, allowing inputs like
marker(singleton("s"), s = "A/B")
. Previously, heterozygous
genotypes had to be provided allele-wise, e.g.,
marker(singleton("s"), s = c("A", "B"))
. The character “/”
must be used as allele separator and will always be interpreted as
such.
Given the simplicity of the new syntax I recommend that homozygous
genotypes are also written out fully, e.g. s = "B/B"
instead of the previous (but still functional)
s = "B"
.
New functions commonAncestors()
and
commonDescendants()
for finding common
ancestors/descendants of members in a pedigree.
The functions ancestors()
and
descendants()
have a new logical argument,
inclusive
, indicating if the person itself should be
included.
New function setSex()
. This is inverse to
getSex()
in the sense that
setSex(x, sex = getSex(x, named = T))
is identical to
x
, whether x
is a single ped
object or a list of such (with unique ID labels).
The old swapSex()
is often more convenient in practise,
since it automatically deals with spouses. One situation where
setSex()
is the only option, is when one wants to assign
unknown sex (sex = 0
) to someone.
New function setMap()
, which can be used for
assigning chromosome and position attributes to marker objects.
New function readFrequencyDatabase()
reads
databases. Both list formats and allelic ladders are supported.
Marker attributes “chrom” and “name” are now easier to get/set in ped lists.
The relabel()
function now also works for ped
lists.
relabel()
now works correctly in pedigrees with
broken loops
mendelianCheck()
didn’t always print as
intended
labels()
function now also works for ped lists
(returning a list of vectors).getSex()
was buggy; this has
been rewritten and made more efficient.New functions for extracting marker properties:
emptyMarkers()
and nTyped()
. These are
generic, with methods for marker
, ped
and
list
.
The functions allowsMutations()
,
isXmarker()
and nAlleles()
are now generic,
with methods for marker
, ped
and
list
.
plot.ped()
now accepts functional forms of the
arguments id.labels
, shaded
and
starred
. This simplifies certain plotting tasks, allowing
calls like
plot(cousinPed(1), shaded = founders, starred = leaves)
.
mutmod<-()
now allows to set the same mutation
model for multiple markers in one call.
Many utility functions now operate not only on single pedigrees
but also on lists of pedigrees. These include chrom()
,
name()
, selectMarkers()
,
setMarkers()
, typedMembers()
and
untypedMembers()
,
selectMarkers()
and friends now accepts boolean
marker selection, meaning that the markers
argument may be
a logical vector (of length equal to the number of attached
markers).
readPed()
is now more careful regarding marker names.
In particular, it should now preserve all names exactly as given, and
raise an error if encountering duplicated names.