PubChase and Papers

I wanted to try out pubchase since it sounds like a great way of getting updates on papers I would want to read. I have uploaded my Mendeley library there, but it will take a few days before it can give me recommendations, apparently. I look forward to seeing how it works.

I have been pretty happy with how ReadCube performs at finding recommendations, but while I love the Enhanced PDF feature in ReadCube I still prefer to use Papers for managing my papers and citations (mainly because I’ve had a lot of trouble using ReadCube for citations in a paper). Papers doesn’t do recommendations, though, and doesn’t have features that lets you track who have cited a paper and things like that. It’s been a long while since I used Mendeley.

I have set up a workflow for automatically importing papers I download in ReadCube into Papers. Is there any easy way of automatically sending papers from pubchase to Papers?

Admixture graph R package

The last couple of months I have worked on and off on an R package for modelling and testing admixture graphs.

You can download it from github or install it directly in R using:


I know, the github repository has an underscore and the package name does not. R packages can’t have an underscore in their name and I didn’t think about it when I made the repository, so that is how it is right now.

Building admixture graphs

I’m using the package in a couple of projects right now where I’m using it to fit graphs to data. The data I work with is D statistics — I don’t compute those in the package but use ADMIXTOOLS — and I use the package to extract equations for the expected values of these statistics and for fitting graph parameters (edge lengths and admixture proportions) to the data.

It is similar to the pqGraph tool from ADMIXTOOLS (that I have never managed to run) except that I don’t compute error bars on parameters yet. I still have to find a good way of doing that. I have some ideas, but it is a bit more complicated than you might think.

Anyway, the code for specifying graphs is a bit crude but pretty straightforward. The code below builds and plots a graph.

leaves <- c("BLK", "PB",
            "Bar", "Chi1", "Chi2", "Adm1", "Adm2",
            "Denali", "Kenai", "Sweden") 
inner_nodes <- c("R", "PBBB",
                 "Adm", "Chi", "BC", "ABC",
                 "x", "y", "z",
                 "bc_a1", "pb_a1", "abc_a2", "pb_a2")

edges <- parent_edges(c(edge("BLK", "R"),
                        edge("PB", "pb_a1"),
                        edge("pb_a1", "pb_a2"),
                        edge("pb_a2", "PBBB"),
                        edge("Chi1", "Chi"),
                        edge("Chi2", "Chi"),
                        edge("Chi", "BC"),
                        edge("Bar", "BC"),
                        edge("BC", "bc_a1"),
                        edge("Adm1", "Adm"),
                        edge("Adm2", "Adm"),
                        admixture_edge("bc_a1", "pb_a1", "ABC"),
                        edge("Adm", "ABC"),
                        edge("ABC", "abc_a2"),
                        admixture_edge("abc_a2", "pb_a2", "x"),
                        edge("Denali", "x"),
                        edge("x", "y"),
                        edge("Kenai", "y"),
                        edge("y", "z"),
                        edge("Sweden", "z"),
                        edge("z", "PBBB"),
                        edge("PBBB", "R")))

admixtures <- admixture_proportions(c(
    admix_props("bc_a1", "pb_a1", "ABC", "a"),
    admix_props("abc_a2", "pb_a2", "x", "b")))
bears_graph <- agraph(leaves, inner_nodes, edges, admixtures)
plot(bears_graph, show_inner_node_labels = TRUE, show_admixture_labels = TRUE)
Admixture graph
Admixture graph

Fitting graphs

With a data frame with columns W, X, Y, Z, and D (the first four should be samples and D is then the D(W,X;Y,Z) statistics) you can then fit a graph to the data.

The interface works with magrittr or dplyr pipelines so you can write something like

data %>% fit_graph(graph) %>% plot

to fit the graph parameters and plot the fit.


Fitted data
Fitted data

You can also extract the fitted parameters from the result of fit_graph() using the coefficients() function, get the fitted values using the fitted() function, and in general use the usual interface for fitted models in R.

Except for confidence intervals with confint(). As I wrote above, I haven’t quite figured out how to do that yet.

It is not terribly solid code yet — it is more likely to crash with a meaningless error message than a meaningful one — but I am working on improving that. If anyone can find a use for it, and give some feedback, I would much appreciate it.

An early modern human from Romania with a recent Neanderthal ancestor

New interesting paper out: An early modern human from Romania with a recent Neanderthal ancestor Fu et al.

Neanderthals are thought to have disappeared in Europe approximately 39,000–41,000 years ago but they have contributed 1–3% of the DNA of present-day people in Eurasia. Here we analyse DNA from a 37,000–42,000-year-old modern human from Pestera cu Oase, Romania. Although the specimen contains small amounts of human DNA, we use an enrichment strategy to isolate sites that are informative about its relationship to Neanderthals and present-day humans. We find that on the order of 6–9% of the genome of the Oase individual is derived from Neanderthals, more than any other modern human sequenced to date. Three chromosomal segments of Neanderthal ancestry are over 50 centimorgans in size, indicating that this individual had a Neanderthal ancestor as recently as four to six generations back. However, the Oase individual does not share more alleles with later Europeans than with East Asians, suggesting that the Oase population did not contribute substantially to later humans in Europe.

I actually heard about this back in May in Cold Spring Harbor, but it is great to be able to actually read the paper.

What especially excites me about this paper is that it is hinting at admixture between Neanderthals and modern humans was pretty common. For some values of “pretty” and “common” at least. What we know so far about Neanderthal admixture is that all non-Africans have a little but that Asians (and Native Americans) have a little more than Europeans — somewhat surprising — and that this most likely is because of a second admixture into Asians.

There was a suggestion that the higher level of Neanderthals in Asians was caused by less negative selection removing it from Asians but a couple of papers argues against that (see e.g. Vernon & Akey 2015).

So there was the admixture event ancestral to all Eurasians, another into Asians, and now a third admixture event.

This individual — and I guess this admixture event — didn’t leave much (if any) genes in extant populations, so it isn’t part of the admixture that we see the results of today, but it was an admixture event between modern humans and Neanderthals nevertheless.

There is a rule of thumb that says: “zero, one, or many” — either something never happens, it is rare enough that it only happens once, or it happens a lot. It is not a strong rule, but now that we have evidence for at least three admixture events it seems hard to argue that interbreeding between modern humans and Neanderthals was rare.

The strange thing now is how uniform the level of Neanderthals is in Eurasians after all. I think I would expect some geographic differences, but maybe such differences have just been evened out by later migration. I don’t know. I don’t really have a strong intuition for that.

Vernot, B., & Akey, J. M. (2015). Complex History of Admixture between Modern Humans and Neandertals. American Journal of Human Genetics.