8650 färgglada bollar: ett genuttrycksnätverk för höns

Genuttryck och höns är ju två av mina intressen, så jag blev givetvis intresserad av Genetic architecture of gene expression in the chicken av Stanley m fl i BMC Genomics. Genetisk arkitektur brukar betyda information om genetiska varianter bakom någon egenskap, men de använder tydligen uttrycket på ett annat sätt. Vad de gjort är ett nätverk som visar korrelationerna i genuttryck mellan 8650 hönsgener, byggt på ungefär 1000 publicerade mikroarrayresultat. Det blir en rätt snygg illustration och en massa öppna frågor. Först något om viktade genuttrycksnätverk!

Metoden de använder kallas WGCNA (det finns ett gäng artiklar om den, se till exempel Langfelder & Horvath 2008 om implementationen i R). Idén är att beskriva hur gener hänger samman genom att se hur deras uttrycksnivåer korrelerar. Det första steget är att göra en stor korrelationsmatris. Så, vilka korrelationer är stora nog att vara intressanta? Istället för att dra en gräns (säg korrelationer större än 0.5 är intressanta) så viktas de med en potensfuktion. Varför en potensfunktion? Jo många nätverk, både biologiska och andra, har det som kallas skalfri struktur där bågarna är fördelade enligt just en potensfunktion. Om nätverket viktas med rätt potens blir det typ skalfritt. En gör alltså antagandet att små korrelationer i allmänhet är oviktiga, men framhäver de stora ännu mer.

Det är god ton bland folk som använder mikroarrayer (”genchip”) och ett krav från många tidskrifter att mikroarraydata publiceras i någon av de offentliga databaserna för sådana. Därför finns det mängder av råa genuttryckdata på internet för den som vill laborera med dem. Det har författarna dragit nytta av och laddat hem varenda hönsarray (av ett visst märke, Affymetrix) de kunnat hitta. Det blev totalt dryga 1000 chip från 67 publicerade experiment på olika vävnader från olika höns. De tog inga hänsyn till under vilka förhållanden genuttrycksvärdena samlades in i första rummet, utan justerade bara för systematiska skillnader mellan experiment.

WGCNA har också ett sätt att dela upp nätverket i moduler (för nördarna där ute: det är hierarkisk klustring, en algoritm för att dela upp det resulterande trädet i grupper och sammanslagning av moduler som är nära varandra). Efter att ha delat upp sitt nätverk i moduler testade de modulerna för anrikning av gener med olika funktioner (”har modulen fler gener av den här typen än det borde bli om de vore slumpvis fördelade”). Här är en Cytoscape-bild av nätverket: varje nod är en gen och varje färg en modul. Mellan noderna går bågar som var och en har en tillhörande vikt. Pilarna pekar ut anrikade funktioner.

chicken_network

(Figur 1, Stanley et al 2013)

Det blir ju en snygg bild och kanske inte så oväntat att antigen processing och immune response som båda har med immunförsvaret att göra eller cytoskelettet och cellcykeln hamnar nära varandra. För min del undrar jag över några saker som inte definieras i artikeln — exakt vad menar de med att en nod är ”among the most highly connected” eller att en modul har ”little or no connections to the rest of the network”. WGCNA har ingen tröskel för när två noder inte anses kopplade, bara bågar med väldigt små vikter. När anser de att en vikt är tillräckligt liten för att inte finnas? En kan lägga märke till att det som pekas ut i diagrammet ovan är ganska allmängiltiga biologiska funktioner. En kan fråga sig om det skulle finnas några skillnader hönsnätverk, ett människonätverk och ett jästnätverk. Går det alls att se några hönsspecifika detaljer? Det finns genuttrycksnätverk som korsar artgränserna, undrar hur mycket det skiljer sig från det här.

Litteratur

Dragana Stanley, Nathan S Watson-Haigh, Christopher JE Cowled, Robert J Moore. (2013) Genetic architecture of gene expression in the chicken. BMC Genomics 14 doi:10.1186/1471-2164-14-13

Peter Langfelder, Steve Horvath. (2008) WGCNA: an R package for weighted correlation network analysis. BMC Bioinformatics 9 doi:10.1186/1471-2105-9-559

Hjärtliga gratulationer

Charles Darwin (12 februari 1809 – 19 april 1882)

Födelsedagen firas med följande väl tajmade artikel i BMC Genomics: Rands m fl. (många fler) Insights into the evolution of Darwin’s finches from comparative analysis of the Geospiza magnirostris genome sequence. Dessutom: historien bakom artikeln från en av författarna, Jonathan Eisen. Artikeln handlar om sekvenseringen av en av arterna och jämförelser med andra fågelgenom. Det kanske blir mer om den en annan dag, men tills dess:

1839_Zoology_F8.11_fig067

(Plate XXXVI, Geospiza magnirostris, The zoology of the voyage of H.M.S. Beagle)

Skimmelhästar och genetiska bieffekter

En bra sak med genetik är att det är ganska komplicerat. En ännu bättre sak med genetik är att det finns ett praktiskt genetiskt fikonspråk och ett matematiskt språk för att beskriva rätt komplicerade saker. Skimmelanlaget, som får hästar att gråna med ålder är en dominant genetisk variant som identifierades 2008 (Rosengren Pihlberg m fl). Det som hänt är att 4600 baser i närheten av genen STX17, syntaxin 17 duplicerats på ett sätt som ändrar hur den uttrycks … En sekvens som flyttas om och ändrar genuttryck, låter inte det bekant? Nåväl. Där börjar i alla fall artikeln jag tänkte titta på idag: Curik m fl. Complex Inheritance of Melanoma and Pigmentation of Coat and Skin in Grey Horses.

Stutemitfohlen

(Foto: Bloodysunday via Wikimedia Commons)

Skimlar blir inte bara vita, de tenderar också att få hudfläckar utan pigmentering (vitiligo) och de drabbas oftare än andra hästar av melanom, som tur är inte lika aggressiv som mänsklig hudcancer. Men hur hänger egenskaperna ihop — orsakas de av samma gener, kanske rentav av STX17? Författarna har tittat på ungefär 1100 hästar med känt slätträd, dna-testat dem, mätt färg och tittat efter vitiligo och melanom.

Här gör det genetiska fikonspråket entré i form av begreppet heritabilitet: den andel av variationen i någon egenskap som beror på ärftlighet. Variationen ifråga är alltså variation mellan individer, så heritabiliteten gäller en population: bland de här individerna, hur stor andel av variationen kan förklaras av deras släktskap med varandra? Heritabiliteten är ett bråktal från 0 till 1: 0,8 för grå färg, 0,7 för spräcklighet, 0,6 för vitiligo (det här är mycket höga heritabiliteter), 0,4 för melanom är mer modest. (Tabell 2 för den som gillar siffror) Men hur mycket av det är STX17 och hur mycket är andra gener? Eftersom de tagit reda på vilken variant av STX17 (och en annan känd genetisk variant) hästarna har kan de se hur stor del av heritabiliteten som beror på den: mellan 0.2 och 0.5, vilket betyder att även om det klassiska skimmelanlaget är viktigt, så finns det andra varianter, antagligen flera med mycket mindre effekter. Särskilt för spräcklighet, som verkar vara lite sin egen grej.

Nästa steg är den genetiska korrelationen: hur egenskaperna samvarierar och om det faktum att de uppträder tillsammans beror på delade ärftliga anlag. Det kan visa på genetiska bieffekter (pleiotropi är den tekniska termen), när en genetisk variant gör mer än en sak. Och de genetiska korrelationerna mellan egenskaperna är höga (Tabell 3), vilket tyder på samma genetiska grund. De testade att kontrollera för de två kända varianterna och då faller de genetiska korrelationerna till nära noll. Det mesta av korrelationen förklaras alltså av de redan kända generna. Utom vitiligo, för pigmentförlusten och skimmelfärgen har fortfarande en avsevärd genetisk korrelation. Där finns det alltså en annan, delad genetisk grund som inte har med är STX17 att göra.

Det brukar vara svårt att hitta varianter för kvantitativa egenskaper för oftast verkar den genetiska grunden bestå av många varianter med små effekter. Men när det gäller just husdjur så verkar det ibland dyka upp genetiska varianter med dramatiska effekter, som STX17. Författarna nämner ett par varianter hos grisar och kor, och jag kan lägga till den variant för kamstorlek hos höns som vi försöker ringa in och som verkar ha en pleiotrop effekt på både kam och ben.

Husdjur är ju lite speciella, som inte bara är med om naturligt urval från miljön som ändrats drastiskt när de blivit tamdjur — tänk på färgvarianter som ersätter djurets vanliga kamouflage med vitt; det verkar inte så praktiskt i naturen. Förutom det, så är de med om artificiellt urval från människor, som ibland föredrar djur med speciella färger och utseenden. Skimlarnas risk för hudcancer är — som vissa hundars eller katters platta nosar — ett exempel på att det kan finnas genetiska bieffekter av sådana estetiska val, och de är inte alltid de bästa för djuren.

Litteratur

Curik I, Druml T, Seltenhammer M, Sundström E, Pielberg GR, et al. (2013) Complex Inheritance of Melanoma and Pigmentation of Coat and Skin in Grey Horses. PLOS Genetics 9 e1003248. doi:10.1371/journal.pgen.1003248

Pielberg, G. R., Golovko, A., Sundström, E., Curik, I., Lennartsson, J., Seltenhammer, M. H., et al. (2008). A cis-acting regulatory mutation causes premature hair graying and susceptibility to melanoma in the horse. Nature genetics, 40 ss. 1004-1009.

Using R: accessing PANTHER classifications

Importing, subsetting, merging and exporting various text files with annotation (in the wide sense, i.e. anything that might help when interpreting your experiment) is not computation and it’s not biology either, but it’s housekeeping that needs to be done. Everyone has a weapon of choice for general-purpose scripting and mine is R. Yes, this is ”quite trivial if you only think it out”, but it still takes me some time. This script is a work in progress and could certainly be much cleaner and friendlier, but I’ll post it for the benefit of any other user that might google for this kind of thing.

Panther is a protein database with phylogenetic trees of proteins annotated with Gene Ontology terms and organised into pathways. (See the paper in the 2013 database issue of NAR.)  Right now, I’m after pathway classification of chicken proteins. The pathways are also available in some xml formats for systems biologists, but I’m going to use the classification table. It contains all UniProtKB proteins, so it should cover most known genes products.

Note, if you just want to check up on a few genes or a few pathways the Panther web interface seems pretty nice. If you’re after nice pathway diagrams, also check out the website and the SBML format. But for accessing classifications en masse, a treatment in R may be useful.

For this post, I’ve broken down the script into parts. If you want a function for the whole thing, see github.

First, download the classification data for your favourite organism from the Panther ftp.

  panther <- read.delim(filename, sep="\t", head=F,
                        stringsAsFactors=F)

  colnames(panther)[1] <- "gene.id"
  colnames(panther)[3:5] <- c("panther.id", "panther.family",
                            "panther.subfamily")
  colnames(panther)[6:8] <- c("go.mf", "go.bp", "go.cc")
  colnames(panther)[9:10] <- c("panther.ontology", "panther.pathway")

This is a tab separated text file. Since some fields at the end of lines may be left empty, we use read.delim instead of read.table. I add som column names that I think agrees reasonably well with the readme. The first is a  gene id string that contains mapping to Ensembl or Entrez ids, as well as the uniprot accession. It looks something like this:

CHICK|Gene=ENSGALG00000013995|UniProtKB=F1P447

CHICK|ENTREZ=378784|UniProtKB=Q75XU5

Of course, we want the ids as separate columns: stringr does regular expressions in a vectorised manner. str_match gets grouped matches into arrays. (Yes, it can be done with a single regexp, but I don’t take pleasure in that kind of thing.)

  panther$ensembl.id <- str_match(panther$gene, "Gene=(.*)\\|")[,2]
  panther$uniprot.id <- str_match(panther$gene, "UniProtKB=(.*)$")[,2]
  panther$entrez.id <- str_match(panther$gene, "ENTREZ=(.*)\\|")[,2]

The gene ontology fields are terms from each ontology, stringed together and separated by semicolons. This is not the best format for querying, so I’ll make a list of GO ids from each ontology:

  parse.go <- function(go.column) {
    go.list <- str_match_all(go.column, "GO:([0-9]*)")
    names(go.list) <- panther$gene.id.string
    go.list <- llply(go.list, function(x) {if (!is.null(dim(x))) x[,1]})
    return(go.list)
  }
  go.mf <- parse.go(panther$go.mf)
  go.bp <- parse.go(panther$go.bp)
  go.cc <- parse.go(panther$go.cc)

Finally, the pathway column. It says this in the readme:

***Example Pathway:
Inflammation mediated by chemokine and cytokine signaling pathway#Inflammation mediated by chemokine and cytokine signaling pathway#P00031>Integrin#Integrin#P00853;Integrin signalling pathway#Integrin signalling pathway#P00034>Integrin alpha#Integrin alpha#P00941

The format of the pathway information is: pathway_long_name#pathway_short_name#pathway_accession>
component_long_name#component_short_name#component_accession

Explanation of pathway accessions:
Gxxxxx Gene or RNA
Pxxxxx Protein
Sxxxxx small molecules
Uxxxxx others, such as ”unknown”, etc.

For now, I’d like to keep just the pathway id, which is the first id of each pathway entry. Again, there are often multiple entries for the same gene.

  pathway.list <- str_match_all(panther$panther.pathway,
                                "#([G,P,S,U][0-9]*)>")
  names(pathway.list) <- panther$gene.id.string
  pathway.list <- llply(pathway.list,
                        function(x) {if (!is.null(dim(x))) x[,2]})

We might want to have these additional descriptions (names of GO terms, name of pathway) later, but for now, I’ll be satisfied with the unique ids. Let’s package everything in a list, and slap a class attribute on it for good measure.

  panther.classification <- list(data=panther,
                                 go.mf=go.mf,
                                 go.bp=go.bp,
                                 go.cc=go.cc,
                                 panther.pathway=pathway.list)
  class(panther.classification) <- "panther.classification"

Now we can get the pathway ids associated with our favourite gene. Take for example GNB3 which has Uniprot id E1C9D6.

get.pathways <- function(panther, acc) {
  
  ix.uni <- which(panther$data$uniprot.id == acc)
  ix.ens <- which(panther$data$ensembl.id == acc)
  ix.ent <- which(panther$data$entrez.id == acc)
  
  if (length(ix.uni) > 0) {
    ix <- ix.uni
  } else if (length(ix.ens > 0)) {
    ix <- ix.ens
  } else if (length(ix.ent > 0)){
    ix <- ix.ent
  } 
  panther$panther.pathway[[ix]]
  
}
get.pathways(panther.classification, "E1C9D6")

I'll get back to this to maybe do something more useful with it.

Weird juxtapositions happen when you import Wikipedia

The network is available on IntegromeDB public database (http://integromedb.org) under the present manuscript title.

So I went there:

integromedb

Apparently, typing in journal article titles was not what the search field was for. Couldn’t find the network either, but the article is still in provisional pdf form so that may be the reason.

Dragana Stanley, Nathan S Watson-Haigh, Christopher JE Cowled, Robert J Moore. (2013) Genetic architecture of gene expression in the chicken. BMC Genomics 14

Om andra väldigt udda kromosomer

Socialkromosom? Nu har han väl ändå tappat det, han som inte ens brukar vilja skriva om gener för någonting. En könskromosom är inte bara en lite udda kromosom med en gen som styr könsbestämning; det är en väldigt udda kromosom som har en gen som styr könsbestämning. Vi och (de flesta) andra däggdjur kör med XY-systemet: X är stor (160 miljoner baser i referenssekvensen, 800 gener) och Y är liten (60 miljoner baser i referenssekvensen, 60 gener). Den könsbestämmande genen sitter på Y-kromsomen och den har det särdeles fantasilösa namnet SR-Y, sex determining region Y. Och sekvensjämförelser visar att Y verkar komma från X. Den är bara en gravt muterad version.

Platypus

(Förberedande näbbdjur. Foto: Stefan Kraft CC-BY-SA-3.0, via Wikimedia Commons)

Fåglar å sin sida har könskromosomerna Z och W. Z är stor, W är liten.  Och även här verkar den lilla, W, vara en söndermuterad version av Z. Men tvärtom är honan den som har två olika: hon har  ZW och hanen som har ZZ. Och ZW och XY är inte släkt! Om vi tittar på höns och människor (mina två favoritdjur) passar Z med bitar av mänskliga kromsom 9 och 5 och X passar med bitar av hönans kromosom 4 och 1. Okej, så det finns alltså minst två helt olika gener som potentiellt kan styra könsbestämning som dräller omkring i ryggradsdjurens genom. Till skillnad från Y så vet ingen riktigt vilken gen det är som styr könsbestämningen. Men något som är tydligt är att det inte fungerar likadant. Vår utveckling av kön är centraliserad via hormonsystemet: om cellerna får könshormon i blodet vid ett visst tillfälle utvecklar de en hankropp, annars en honkropp. Fåglar däremot verkar ha cellbaserad könsbestämning. Cellen följer sina egna genetiska instruktioner och gör sin egen grej. Det betyder att det kan finnas gynandromorfa fåglar: de är delvis tupp och delvis höna och deras kroppar består av olika ZZ- och ZW-cellpopulationer som utvecklats till kroppsdelar med olika könsegenskaper (Zhao et al 2010).

Duck_billed_platypus_schnabeltier

(Heinrich Harder (1858-1935) via Wikimedia Commons)

Men det blir rörigare! (Jag inser att det ser ut som att jag ljuger för er nu, men det här kommer faktiskt från den vetenskapliga litteraturen (review av Marshall Graves 2008) även om det låter helt vansinningt.) Reptiler har kan ha olika varianter av könskromosomer eller temperaturstyrd könsbestämning. Men näbbdjuren som alltid ska vara värst har inte ett par könskromsomer, utan fem: X1Y1 X2Y2 X3Y3 X4Y4 X5Y5 Och dessutom: näbbdjurens könskromosomer verkar komma från samma delar av genomet som ZW. Så ZW-systemet kan fungera könsbestämmande med den lilla udda könskromosomen hos hanen eller med den lilla udda könskromsomen hos honan. Va?!

Platypus_by_Lewin

(Ett näbbdjur i förvirringen. John Lewin (1770-1819) via Wikimedia Commons)

Men könskromosomer bildas, antagligen, på ett sätt som liknar supergenen kring Gp-9 hos S. invicta: när rekombinationen av någon anledning avstannat kan diverse mutationer ackumuleras och eftersom de alltid ärvs tillsammans med den könsbestämmande varianten finns det utrymme för olika könsspecifika varianter att utvecklas. Sak samma om en genetisk variant på Y gör något som inte fungerar i en honkropp: den befinner sig alltid i hankroppar. Och vice versa för en gen på fåglarnas W. Samtidigt kan lite vad för skräp som helst, till exempel varianter som raderar stora bitar, följa med bara för att de hänger ihop med den könsbestämmande varianten. Ungefär så går gängse teori. Eftersom XY och ZW kommer från helt olika delar av genomet och ändå liknar varandra på så många sätt, verkar det vara något speciellt med könsbestämning. Kromosomer som slår sig i lag med genetisk könsbestämning får vara med om konstiga saker.

Är det något speciellt med den sociala varianten hos S. invicta (Wang et al 2013)? Kommer Sb-kromsomen, som Wang & co kallar kromosomen med den inverterade b-allelen att tappa sekvenser som en Y- eller W-kromosom? Deras hypotes är nej, eftersom den måste passera genom hanmyrorna …

Although the above analyses reveal notable similarities among the Sb, Y and W animal chromosomes, we predict that the rate of gene degeneration in the non-recombining Sb region compared with Y and W animal chromosomes should be relatively slow because of purifying selection in ant haploid males.

Det är nämligen så att hanmyrorna är haploida; de bär bara på en kopia av genomet. S-kromosomen är ingen könskromosom och det här har heller inget med könskromosmer att göra, utan det gäller alla kromosomer. Hanmyrorna har bara en uppsättning. Så om det dyker upp några konstigheter på Sb-kromosomen så har de ingen fungerande SB-kromosom att falla tillbaka på. Därför borde inte Sb kunna mutera lika vilt som en Y- eller W-kromsom. Myror har också sina genetiska konstigheter.

Litteratur

Marshall Graves JA (2008) Weird animal genomes and the evolution of vertebrate sex and sex chromosomes. Annual reviews in genetics 42 ss. 565-586

Wang J, Wurm Y, Nipitwattanaphon M, Riba-Grognuz O, Huang Y-C, Shoemaker D, Keller L. (2013) A Y-like social chromosome causes alternative colony organization in fire ants. Nature 493 ss. 664-668 doi:10.1038/nature11832

Zhao D, McBride D, Nandi S, McQueen HA, McGrew MJ, Hocking PM, Lewis PD, Sang HM, Clinton M. (2010) Somatic sex identity is cell autonomous in the chicken. Nature 464 ss. 237-242

More Haskell fun: the regress of a function

I thought this was pretty funny. Let’s follow the development of one part of my toy bootstrap script. (You have to keep in mind that I’m playing around with functional programming for the first time and that I’m completely utterly horrible at this!) So far, using pseudorandom draws with replacement from a list of data, my script will produce bootstrap replicates of that list. This is the part that, after the random draws have been partitioned into lists of sufficient length goes on to pull out the right elements of the data. The first iteration (heh) goes like this with explicit recursion:

applyShuffle x shuffle =
  if shuffle == [] then
    []
  else
    [x !! head shuffle] ++ applyShuffle x (tail shuffle)

applyShuffleOrder x shuffleOrder =
  if shuffleOrder == [] then
    []
  else
    [applyShuffle x (head shuffleOrder)] ++
       applyShuffleOrder x (tail shuffleOrder)

So, a ”shuffle” in the above is a list of indices of elements of data that form a bootstrap replicate. A ”shuffle order” is a list of such lists. Next step, why not try some pattern matching? Also, the (x:xs) notation for lists makes it look a little more Haskell-y:

applyShuffle x [] = []
applyShuffle x (index:indices) =
    [x !! index] ++ applyShuffle x indices

applyShuffleOrder x [] = []
applyShuffleOrder x (shuffle:shuffles) =
    [applyShuffle x shuffle] ++
        applyShuffleOrder x shuffles

Enter the map function! Map really just applies a function recursively to a list. (For friends of R: it’s like llply or lapply.) It’s still recursion, but it kind of reads like what I would say if I was to tell somebody what the function does: ”map the applyShuffle function to the shuffles we’ve already generated”. This is the second function again, but with map:

applyShuffleOrder x shuffles =
  map f shuffles
  where f = applyShuffle x

At this point you might realise that the functions can be easily combined into something much shorter. That is, you dear reader might have realised that before, but for me it came at this point. I also decided to stop talking about shuffle orders, and simply call them shuffles. At the end, this is all that remains of the above functions.

applyShuffles x shuffles =
  map applyShuffle shuffles
    where applyShuffle = map (x !!)

Mer om myrorna med socialkromosomen

Vet inte riktigt om det framgår av bloggen, men själv använder jag genuttrycksmetoder för att studera diverse egenskaper hos höns. Så den korta biten om genuttryck i artikeln om myrorna intresserade mig lite extra. Och för några år sedan publicerade några av samma gäng en artikel om genuttryck hos samma myror. Och till skillnad från Nature-artikeln är den här i PLOS Genetics, vilket betyder att den är fri att läsa och kopiera för alla: Genome-Wide Expression Patterns and the Genetic Architecture of a Fundamental Social Trait.

De jämförde mRNA mellan BB– och Bb-arbetsmyror från 20 kolonier med fler än en drottning. Resultatet var inte direkt överväldigande: de fann 39 gener vars uttryck skilde sig åt, bland dem gener som liksom Gp-9 kodar för luktreceptorer. Men när de väl hittat den stora inversionen som gör området till Gp-9 till en supergen faller de här resultaten i ett lite annat ljus: det visar sig nämligen att 70% av de gener som skiljer sig i uttryck ligger just i området med inversionen vilket är betydlig fler än de ungefär 5% av alla gener de mätte som ligger där. (Med liknande resultat för jämförelser mellan drottningar och hanmyror i den nya artikeln.)

Det här är ett enrichment test (kanske anrikningstest på svenska) vilket är väldigt vanligt i genuttrycksbranschen. Det jämför helt enkelt hur många gener av en viss kategori som dyker upp med hur många en skulle vänta sig av ren slump. Ofta är det inget vidare test, men det här tror jag är en situation där det passar rätt bra. Det finns ingen särskild anledning att tro att gener som skiljer sig mellan myror med olika variant av Gp-9 skulle ligga på något särskilt ställe i genomet, om det inte vore för den här typen av stora omflyttningar runt genen själv. Det är förmodligen ett exempel på att när inversionen väl har hänt och det inte kan bli några överkorsningar i området så kommer alla möjliga varianter att ärvas tillsammans med Gp-9-allelen, just för att de inte kan rekombineras bort från varandra.

Litteratur

Wang J, Ross KG, Keller L. (2008) Genome-Wide Expression Patterns and the Genetic Architecture of a Fundamental Social Trait. PLOS Genetics 4 e1000127. doi:10.1371/journal.pgen.1000127

Om någon av mina studenter läser det här

Så har ni förhoppningsvis gjort er förtjänta av en välbehövlig paus. Jag vill inte uppmuntra till dryckenskap eller kille-med-gitarrbeteende, men den här söta nördiga videon innehåller i alla fall några kul upplysningar om osmoreglering, cellsignalering samt vår favoritorganism från labb B1.

(Mina och mina … Studenterna är väl sina egna. Dessutom är jag bara med på labbar och hoppar in på ett par föreläsningar. Men det tycker jag är fullt tillräckligt mandat att föreslå youtubeklipp i alla fall.)

This is your brain on Haskell

For the last week or so I’ve been playing a little with Haskell, which seems to be great fun. At pretty low intensity, that is, in the evenings. I’ve never done anything with functional programming before, though I’ve taken courses that involved a little recursion, a bit of algorithms etc, so everything is not completely foreign to me. Well, it feels very foreign, a bit like trying to read French (I don’t read French).

Anyway, I felt like it was time to write a little program that actually does something, so I’ll try to make a script for bootstrapping. Even though bootstrapping is not the best thing in the world, a bootstrap comparison between the means of two groups seems a nice task to try: it is not completely trivial, but will make me try useful things like pseudorandom numbers and reading a csv file.

Of course, I haven’t got that far yet. Here is the script on github. (Yes, I’m also trying to get used to github.) When trying to do anything I quickly find myself thinking in terms of procedures, states and side-effects, or otherwise thinking wrong. On the other hand, yesterday evening just before sleep, I had one of those code epiphanies. ”Of course, I just need to do that . . . ” So, while the half-baked script is not that impressive, the process of writing it is probably the most fun I’ve had with a computer since Starcraft II: Wings of Liberty.

Right now, it can make bootstrap replicates of a list of integers, using a sequence of pseudorandom numbers (derived from the seed 42, so not random at all, but I’m sure you can get entropy through some monad later). I think the next thing will something to get data into the script.

I’m just remembering how to do recursion. Like this little thing, that puts data in some given order. It just handles the first element, then calls itself to deal with the rest. I think this is why I like the apply-split-combine approach in R so much, because it really feels like you’re doing almost no work at all.

applyShuffle x shuffle =
  if shuffle == [] then
    []
  else
    [x !! head shuffle] ++ applyShuffle x (tail shuffle)

To be continued, I guess.