Blog Image

Parentela

Blog: genetica forense y probabilidad

Familias y mucho más
¿No os acordáis? sen^2 x + cos^2 x = 1 :))))))

Otra mejora más aplicable a Familias!

Software Posted on Mar, febrero 11, 2020 19:21

Ya os he hablado de Magnus Vigeland (ver https://parentela.familias.name/category/category4/). Pues bien, él ha desarrollado mucho software en R, y ahora Familias puede aprovecharse de ese trabajo!

Thore me ha enviado un ejemplo en el que se demuestra claramente el potencial que tiene combinar Familias y R. Podemos leer en R un archivo de Familias (.fam) con el comando «readFam», y también podemos dibujar los pedigríes definidos en el archivo de Familias con el comando «plotPedList».

Para poder hacerlo primero tenéis que saber dónde debe estar almacenado el archivo .fam para que R lo pueda leer. Para esto sólo tenéis que teclear en R:

getwd()

Y R os responderá dónde tenéis que almacenar el archivo .fam  (también podríais indicar una ruta, pero es más fácil almacenar el archivo en el working directory de R).

Bueno, pues vamos a ver el ejemplo de Thore usando el archivo de familias sibs3.fam que podéis descargar aquí (ya sabéis, teclas Ctrl + S para descargarlo) y que debéis guardar en el working directory.

Ahora tenéis que instalar el paquete de R para aplicaciones forenses  llamado  «forrel». Para instalarlo sólo debéis teclear lo siguiente en Rstudio o en la consola R (se necesita conexión a internet):

install.packages(«forrel»)

La instalación de forrel sólo hay que hacerla una vez.

Ok, ahora ya estamos preparados para el ejemplo. Debéis teclear en R:

library(forrel)
x = readFam(«sibs3.fam», verbose = F)
plotPedList(x, marker = 1, shaded = typedMembers, frametitles = names(x),
                   newdev = T, dev.width = 8)

Y en seguida veréis este resultado:

Maravilloso!! Muy útil para incluir los pedigríes en nuestros informes!!

También podemos calcular directamente los LRs en R si además tecleamos:

kinshipLR(x, ref = 3)

Y obtendremos:

## Total LR:

##  H1:Full  H2:Half H3:Unrel

## 8.333333 2.916667 1.000000

En el comando anterior,  ‘ref = 3’ significa que los LRs están escalados con respecto a H3, es decir os da el LR con  ‘H3:Unrel’ como referencia. Podéis encontrar más documentación y ejemplos si tecleáis:

?kinshipLR

Si decidís usar el working directory, cada vez que queráis usar esta herramienta con otro archivo, solo debéis modificar el nombre del archivo en las líneas de comandos de arriba:

En lugar de x = readFam(«sibs3.fam», verbose = F), debeis escribir x = readFam(«nombre de vuestro archivo.fam«, verbose = F)

O si preferís, en lugar de guardar el archivo .fam en el working directory de R, también podríais indicar la ruta en donde lo tengáis guardado, por ejemplo:

x = readFam(«C:/Users/lourditasmt/Documents/sibs3.fam», verbose = F)

Que rápido se hace y que bonito queda!!

Magnus y Thore, mil gracias, sois genios!!



relMix-pedigries 2

Software Posted on Mié, junio 06, 2018 17:40

Bueno, pues quedamos el otro día en ver cómo se hacen los
pedigríes del caso de la mujer mantiene
relaciones sexuales con dos hermanos, queda embarazada y quiere saber cuál de
los dos es el padre del bebé antes de su nacimiento.

Como ya sabéis, lo primero que tenemos que hacer es listar
los individuos necesarios para definir el pedigrí. En este caso necesitaremos
al hijo, los dos presuntos padres, la madre y claro, también necesitaremos a
los padres de los presuntos padres para poder definir que son hermanos entre
sí. Vamos a darles los siguientes nombres: Child (hijo), Thore (PP1), Daniel
(PP2), Mother (la madre, he tenido grandes tentaciones de darle un nombre de
chica GHEP o llamarla Guro, pero no liemos las cosas…J)), A (padre de Thore y
Daniel) y B (madre de Thore y Daniel).

Por tanto, el vector id sería:
c
(«Child», «Thore», «Daniel», «Mother»,
«A», «B»)

Las hipótesis de nuestro caso son: Thore es el padre vs. Daniel
es el padre, así que los vectores dadid y momid serían, para cada caso:

Ped1: Thore es el padre:
c(«Thore»,»A»,»A»,NA,NA,NA)
c(«Mother»,»B»,»B»,
NA, NA, NA)

Si leéis en vertical los tres vectores definidos hasta
ahora, estamos diciendo que Thore y Mother son los padres de Child, y que A y B
son los padres de Thore y de Daniel.

Ped2: Daniel es el padre:
c(«Daniel»,»A»,»A»,NA,NA,NA)
c(«Mother»,»B»,»B»,
NA, NA, NA)

que significa que Daniel y Mother son los padres de Child, y
que A y B son los padres de Thore y de Daniel.

Y finalmente, el vector sex, que es igual en ambos
pedigríes, claro está:
c(«male»,
«male»,
«male»,»female»,»male»,»female»)

Vale, ya lo tenemos, ahora sólo tenemos que poner todo en
orden y llamar a la función FamiliasPedigree. Quedaría así:

ped1 <-
FamiliasPedigree(c(«Child»,»Thore»,»Daniel»,»Mother»,»A»,»B»),
c(«Thore»,»A»,»A»,NA,NA,NA),
c(«Mother»,»B»,»B»,
NA, NA, NA),
c(«male»,
«male»,
«male»,»female»,»male»,»female»))

ped2 <-
FamiliasPedigree(c(«Child»,»Thore»,»Daniel»,»Mother»,»A»,»B»),
c(«Daniel»,»A»,»A»,NA,NA,NA),
c(«Mother»,»B»,»B»,
NA, NA, NA),
c(«male»,
«male»,
«male»,»female»,»male»,»female»))

¿Comprobamos
si lo hemos hecho bien? Es muy fácil! Sólo tenéis que hacer lo siguiente:
– Abrir R
– Cargar la librería Familias escribiendo: library(Familias)
– Copiar el ped1 tal y como lo hemos escrito
– Ver la representación gráfica del pedigrí
simplemente escribiendo: plot(ped1)

Y lo mismo para el ped2. Qué bonito! ¿verdad?

También podéis poner nombre a los pedigríes en la
representación gráfica. Sólo tenéis que escribir en R:

par(mfcol = c(1,2))
plot(ped1); title(«Thore»)
plot(ped2); title(«Daniel»)
par(mfcol = c(1,1))

Como
vimos en la presentación en pdf del post anterior, también se pueden escribir los
pedigríes especificando los nombres de los vectores. Podéis verlo si descargáis
los archivos ped1-Thore
y ped2-Daniel.

Todo esto que os he contado, también sirve para Familias,
claro está. Por ejemplo, si habéis definido los pedigríes en Windows Familias
como en este archivo llamado trio,
podéis ir a la ventana de Pedigrees, seleccionar un pedigrí y “Plot in R”. Os
aparecerá una ventana con el código:

#Define the persons involved in the case
persons <- c(«AF», «mother», «child»)
sex <- c(«male», «female», «female»)

#Define the pedigree
ped1 <- FamiliasPedigree(id=persons,
dadid=c(NA,NA,»AF»), momid=c(NA,NA,»mother»),
sex=c(«male», «female», «female»))

Ahora ya sabéis lo que significa todo eso!

Por cierto, Thore y Daniel, qué habéis estado haciendo para
estar involucrados en este caso???
Thore dice que hay una palabra en noruego para definir la relación entre dos hombres que tienen relaciones sexuales con la misma mujer (‘Buksvogere’), y que curiosamente, la versión en femenino de esta palabra (‘Buksvigerinner’) no existe virtualmente. También dice, sonriendo, que no hay traducción al español de estas palabras, quizás porque no sean necesarias en nuestro mundo latino… Está claro que está siendo muy sarcástico… no tenemos la palabra, pero desde luego la practicamos, tanto en femenino como en masculino smileysmiley!!! Yo creo que incluso habría que inventarse algunas palabras más, sólo hay que ver los casos de paternidad que tenemos en nuestros labs!!!!



relMix-pedigries 1

Software Posted on Vie, mayo 25, 2018 19:44

Definiendo pedigríes
sencillos

Hola queridos!
Hoy os voy a mostrar una de las cosas más entretenidas de
relMix, la definición de los pedigríes. Es como hacer sudokus! Incluso
podríamos hacer una competición para ver quién hace el pedigrí más complejo.

Como sabéis, por defecto, relMix ya viene con los típicos
pedigríes de un caso estándar de paternidad: el que define el trío
padre-madre-hijo (llamado «Paternity») y el que define que el presunto
padre no está realmente relacionado con el hijo (llamado «Unrelated»,
definiendo sólo la relación madre-hijo). Seguro que os habéis preguntado cómo
relMix establece las relaciones de parentesco. Bueno, pues lo hace con una de
las funciones de Familias en R, llamada FamiliasPedigree, creada por Peter
Mostad y que se basa en una función anterior llamada kinship2. Me parece
bastante difícil que yo pueda entender con claridad cómo funciona
FamiliasPedigree, pero es bastante fácil darle órdenes.

Esto os va a ser muy útil para usar relMix con otros
pedigríes que no sean el típico trío, ya vemos un ejemplo después. Pero es
mejor empezar por lo más sencillo, el trío. El pedigrí se define mediante 4
vectores. Ya empezamos … vectores, estudié esto en el Jurásico!! Pero no nos
compliquemos, un vector no es más que una lista de valores, y para que R lo
entienda hay que escribirlo con una «c» y unos paréntesis que
contienen los valores. Ejemplo
para tres valores: c(«valor1», «valor2»,
«valor3»).

Bueno, pues ya casi sabemos todo lo que necesitamos saber en
cuanto a programación, lo demás es lógica pura. Vamos a ver entonces los cuatro vectores
necesarios:

a) En el primer vector (llamado id), definimos los
individuos necesarios para el pedigrí, por ejemplo: c(«mother»,
» child», «AF») para el típico trío

b) En el segundo vector (llamado dadid) definimos los padres
de cada uno de los individuos del primer vector. En el caso del trío, no nos
interesa para nada quién es el padre de «mother», ni quién es el
padre del presunto padre «AF», así que sólo tenemos que decir que
«Not Available» (NA). El orden de los valores es el que define a
quién nos estamos refiriendo, me explico, en el vector id, el valor
«mother» está en la primera posición, así que en este vector
«dadid», tenemos poner quién es el padre de «mother»
también en la primera posición. Y lo mismo para las siguientes posiciones. Así,
con el vector

c(NA, «AF», NA)

estamos diciendo que no nos importa quién es el padre de
«mother» (primera posición), que el padre de «child» es
«AF» (segunda posición), y que no nos no nos importa quién es el
padre de «AF» (tercera posición). ¿Se entiende?

c) En el tercer vector (llamado momid) definimos las madres
de cada uno de los individuos del primer vector. En el caso del trío, también
teniendo en cuenta sus posiciones:

c(NA, «mother», NA)

Traducido a frase: no nos importa quién es la madre de
«mother», la madre de «child» es «mother», y no
nos no nos importa quién es la madre de «AF».

d) Y el cuarto vector (llamado sex) nos sirve para
establecer el género de cada individuo. En el caso de que «child»
fuera una niña, el vector se definiría:

c(«female», «female», «male»)

Es decir, «mother» es «female»,
«child» es también «female» y «AF» es
«male». El hecho de que los varones no puedan quedarse embarazados
facilita mucho este vector ;)))))

Bueno, pues ya casi lo tenemos! Ahora sólo tenemos que
llamar a FamiliasPedigree y mandarle que cree el pedigrí teniendo en cuenta la
información que le damos en los 4 vectores. Hay varias formas de escribir el
código para esto, pero la más sencilla tiene la estructura:

ped1 <- FamiliasPedigree(vector1, vector2, vector3,
vector4)

Es decir, en el ejemplo que hemos visto, sería:

ped1 <-
FamiliasPedigree(c(«mother», «child», «AF»), c(NA,
«AF», NA), c(NA, «mother», NA), c(«female»,
«female», «male»))

Qué contenta
estoy!! Me siento menos analfabeta al saber interpretar unas líneas de código!!
Los jóvenes no pensaréis lo mismo, pero para los que somos del siglo pasado
esto es todo un hito!

Una vez que ya sabemos todo esto, es más fácil definir el
pedigrí para hipótesis alternativa (AF no está relacionado con child):

ped2 <-
FamiliasPedigree(c(«mother», «child», «AF»),
c(NA, NA, NA), c(NA, «mother», NA), c(«female»,
«female», «male»))

La única diferencia con ped1 está en el segundo vector
(dadid), que define quién es el padre de «child».

Bueno, algo muy importante, los vectores dadid, momdid y sex
deben tener la misma longitud que el vector id siempre, es decir, si id tiene
tres valores, los demás deben tener también 3 valores. Como os he dicho, lógica
pura.

Podéis descargaros aquí un resumen de
todo lo que hemos visto.

En el siguiente post veremos cómo definir los pedigríes para
resolver este caso:

Una mujer mantiene relaciones sexuales con dos hermanos y
queda embarazada. Con el fin de saber cuál de los dos es el padre del bebé
antes de su nacimiento, se somete a una prueba no invasiva de paternidad a
partir de plasma.

Y nada más por hoy, que me he enrollado mucho! Dejarme sólo que le de las gracias a Thore por revisarme esto. Y esta vez se merece mucho el agradecimiento, pues están teniendo temperaturas de 20 grados por las noches en Oslo y él ha tenido la paciencia de sentarse a leer esto, perdiéndose un rato del Caribe Noruego!!



relMix 2

Software Posted on Jue, mayo 17, 2018 20:18

Frecuencias
mínimas en relMix

Como mucho de
vosotros sabéis, en relMix y en Familias se requiere que la suma de las
frecuencias alélicas de cada marcador sume 1, como en la vida real. Esto
también tiene que ver con los modelos mutacionales que el software puede
utilizar (ver por ejemplo, pág. 171 del libro de Thore:
http://www.familias.name/book.html). Pero ¿qué pasa si queremos utilizar
una frecuencia mínima en algún caso que estemos evaluando? Bueno, pues aquí va
la explicación de cómo funciona esto en relMix (aplicable también a Familias),
con un ejemplo que me envió Thore.

En realidad
existen dos versiones de relMix:
i) la llamada «function version»
más orientada a investigadores y
ii) la «GUI version» más orientada
a usuarios.
Pero ambas versiones usan el mismo código, la misma función de
verosimilitud y necesitan que las frecuencias de cada marcador sumen 1. En la
versión GUI, las frecuencias alélicas se «pre-procesan» de forma que
si no suman 1, el usuario tiene que tomar una decisión (como en Familias).

Por ejemplo,
imaginemos que disponemos de las siguientes frecuencias (no muy realistas, sólo
es un ejemplo) para el siguiente marcador M1:

Marker-1

Alelo 8 = 0.0008

Alelo 9 = 0.3992

Alelo 10 = 0.4000

Suman 0.8, en
lugar de 1. El software entonces te ofrece dos opciones:

a) Añadir un
«rest allele», es decir añadir un alelo extra con la frecuencia
necesaria para que la suma sea 1

b) Escalar, es
decir, redondear las frecuencias de los alelos 8, 9 y 10 para que sumen 1

En el ejemplo
anterior, si el usuario decide añadir un alelo extra llamado «rest
allele», obtendrá:

Marker-1

Alelo 8 = 0.0008

Alelo 9 = 0.3992

Alelo 10 = 0.4000

Rest allele = 0.2

Y si por el
contrario, el usuario decide escalar, cada frecuencia alélica se dividirá por
la suma de todas las frecuencias (en este caso, por 0.8), y así obtendrá:

Marker-1

Alelo 8 = 0.0010

Alelo 9 = 0.4990

Alelo 10 = 0.5000

Pero no nos
perdamos, estábamos interesados en usar frecuencias mínimas, así que imaginemos
que la frecuencia del alelo 8 (0.0008) nos parece demasiado pequeña e imprecisa
y pensamos que esto podría sesgar el resultado. Queremos entonces usar la
frecuencia mínima en lugar de la estimada, por ejemplo queremos usar una
frecuencia mínima de 0.01. En relMixGUI esto se define cuando cargamos la base
de datos (Database -> Options) y así, nuestro archivo original (con alelo 8
= 0.0008) se convierte en:

Marker-1

Alelo 8 = 0.01

Alelo 9 = 0.3992

Alelo 10 = 0.4000

En este caso,
como las frecuencias no suman 1 (suman 0.8092), el usuario tiene que decidir si
escalar o añadir un alelo extra. Pero en otros casos, si al añadir la
frecuencia mínima, la suma supera el valor 1, la única opción es escalar (no se
pueden añadir alelos extra, pues la suma aún daría un valor más grande que 1).

En el ejemplo, lo
más razonable es añadir un alelo extra, pues si escalamos la frecuencia mínima
que hemos introducido en el alelo 8 se modificaría también
(0.01/(0.01+0.3992+0.4000) = 0.0125), y no queremos que eso pase.

Veamos cómo funciona
entonces con un ejemplo de Thore:

Ejemplo (sin
drop-out, sin alelo silente, sin theta)

Madre = 9/9

Padre = 8/10

Mezcla = 8/9

p = frec. alelo 8
= 0.0008

H1 :
«Padre» es el padre

H2 : un hombre al
azar es el padre

LR = 0.5/p = 625

(En detalle: LR
=0.5/(p^2+2*p(1-p)*0.5)=1/p)

El resultado LR =
625 es exactamente el que saldría con relMixGUI si la frecuencia mínima la
definimos = 0 y no escalamos.

Si decidimos
escalar, pero seguimos sin usar la frecuencia mínima, entonces la frecuencia
del alelo 8 pasa de ser 0.0008 a ser 0.001 como hemos visto anteriormente (p =
0.0008 / 0.8) y el LR sería entonces:

LR = 0.5/p = 500

Finalmente, si
decidimos usar una frecuencia mínima de 0.01 y no escalamos (p = 0.01), el LR
tomaría un valor de:

LR = 0.5/p =50

Para que lo
podáis comprobar Thore nos manda archivos con este ejemplo. Podéis descargarlos
aquí: mezcla, referencias, database (ya sabéis, una vez estéis en la dirección,
control + s para guardarlos en vuestro ordenador)

Espero que os sea
útil este comentario! Lo importante es que sigamos aprendiendo!



relMix 1

Software Posted on Mar, mayo 15, 2018 10:59

Menudo grupo de matemáticos forenses hay en Noruega!! Además
de ser buenísimos, son de lo más generoso. Hoy os voy a hablar de una
herramienta que ha creado Guro Dørum,
una genial matemática que además es la mejor bailarina de salsa de Europa, os
lo aseguro!

Guro ha puesto a nuestra disposición de forma gratuita, una
aplicación para evaluar mezclas en las que los contribuyentes están
emparentados. ¿Habéis tenido alguna vez un caso de agresión sexual con
resultado de embarazo en el que hayáis necesitado comparar una muestra de suero
de la víctima (mezcla) con un sospechoso? Demostrar la paternidad en este caso
es muy importante, pues puede implicar al sospechoso como agresor. Y sin ir a
un caso tan extremo… ¿habéis necesitado investigar la paternidad de un niño
aún no nacido?

El principal problema de estos casos de mezclas es que no
conocemos el perfil genético del bebé, lo tenemos formando parte de una mezcla
con su madre. Claramente, en las hipótesis tendremos que tener en cuenta que la
mezcla está formada por individuos emparentados.

El software se llama relMix y está hecho en R. Una vez que
os descarguéis e instaléis el paquete «relMix» en R, podéis acceder a
él con los siguientes comandos:

>
library(relMix)

>
relMixGUI()

Es bastante frecuente que en las muestras de plasma materno
detectemos la mezcla muy desequilibrada, con un perfil muy mayoritario
procedente de la madre y un perfil muy minoritario correspondiente al niño. No
pasa nada! Con relMix podéis evaluar este tipo de mezclas sin problemas, pues
se puede tener en cuenta que puede haber drop-out y drop-in en la mezcla (y
también podéis evaluar varios replicados de la mezcla a la vez). El software
también es capaz de evaluar la mezcla considerando mutación (con diferentes
modelos). Es decir, que el caso puede ser complicado, pues relMix está
preparado para evaluar casos complejos.

Más aún, las relaciones de parentesco no tienen por qué ser
el típico trío padre-madre-hijo, relMix evalúa también otros parentescos. Por
ejemplo, una mujer que ha mantenido relaciones con 2 hermanos y queda
embarazada puede querer saber cuál de los dos es el padre, antes de que nazca
el bebé. Pues simplemente hay que definir bien las hipótesis y ya está. Alucinante!!

Podéis encontrar toda la información sobre relMix en la
publicación de Guro:

Dørum, G.,
Kaur, N. & Gysi, M. Pedigree-based relationship inference from complex DNA
mixtures. Int J Legal Med (2017) 131: 629.
https://doi.org/10.1007/s00414-016-1526-x

Y además podéis descargaros una presentación .pdf y un vídeo
explicativo de nuestro queridísimo Thore en estos links:

http://www.few.vu.nl/~ksn560/Block-III-Part2-Mixtures-TE-ISFG2017.pdf

http://familias.name/VideosBook.pdf
(es el primer vídeo de la lista)

Bueno, pues además tenemos que dar la enhorabuena a Guro
doblemente, por el software y porque ha sido mamá hace poco. Esperamos que hayas pasado un feliz día de la
madre querida Guro!!