Fylla en funktion

När jag för några år sedan letade efter ett verktyg för att enkelt generera HTML med automatiska källförteckningar stötte jag på Pandoc, som jag använt flitigt sedan dess, bl.a. för denna blogg, och som jag diskuterade i min uppsats i arkivvetenskap om hållbara filformat, som jag skrev om här den 2 juni. Genom detta fick jag höra talas om Haskell, det språk i vilket Pandoc är utvecklat. Det är ett språk som skiljer sig ganska markant från de flesta väletablerade programmeringsspråk genom att det är rent funktionellt. De funktioner som finns i vanliga programmeringsspråk kan ha s.k. sidoeffekter som inte är kopplade till deras returvärde: de modifierar variabler, läser och skriver filer och skriver till skärmen. Detta gör funktionernas beteende svårförutsägbart och skiljer dem från funktioner i matematisk mening, som alltid ger bestämda utdata för en viss uppsättning indata. Haskell eliminerar sådana sidoeffekter: vill jag komma åt filsystemet eller ta emot data från användaren (annars blir det svårt att konstruera några användbara program) får jag definiera en funktion som returnerar en s.k. I/O-handling.

Språket är uppkallat efter logikern Haskell Curry (1900–1982), och har en specifik koppling till honom. Han bidrog till utvecklingen av currying, en teknik som innebär att en funktion med flera argument omvandlas till en kedja av enställiga funktioner: har vi t.ex. en tvåställig funktion \(x-y\), kan vi för \(x=2\) definiera en ny enställig funktion \(2-y\). Currying är centralt i Haskell eftersom alla funktioner är enställiga.

För ett par månader sedan uppmärksammades i Wired att Facebook numera använder Haskell för att utveckla sitt antispamsystem (Metz 2015). Olika fördelar med språket när det gäller sådana tillämpningar diskuteras, men programmeraren Mathias Biilmann liknar det vid ett språk från en alternativ framtid som aldrig kommer att infalla och säger att det är så annorlunda jämfört med etablerade språk att det inte finns en chans att det kommer att bli vanligt.

Jag undrar om inte barriären när det gäller ökad användning av Haskell handlar mycket om bristen på färdiga väldokumenterade bibliotek. Det är t.ex. en tilltalande tanke att använda funktionella språk för analys och visualisering av data (vanliga kalkylblad är, som påpekas av HaskellWiki (2015), bara en specialiserad form av funktionell programmering), men om det inte finns verktyg för att hantera datatabeller och generera diagram utifrån dessa kräver det mycket arbete från grunden, och det är nog få som är motiverade att göra detta när de har tillgång till språk som Python (med Pandas), R och Julia.

Situationen har dock förbättrats de senaste åren. Nu i somras laddades t.ex. paketet Frames upp till Haskells stora paketförråd Hackage (Cowley 2015a). Detta paket kan användas för att läsa in CSV-filer (eller textfiler separerade med andra tecken) i en tabellstruktur, och paketet har ett överskådligt tutorial (Cowley 2015b). Jag provade att göra ett enkelt program för att generera diagram utifrån Socialstyrelsens matriser över incidens i cancer i Sverige, som jag skrivit om i de senaste inläggen, och det finns tillgängligt via GitHub. Om programmet kompileras och textfilen IncWebR2011.txt finns tillgänglig kan nedanstående diagram över utvecklingen av incidensen (åldersstandardiserad till 2000 års svenska befolkning) i akut myeloisk leukemi (ICD 2050) i Sverige 1960–2011 sparas till aml.svg genom att ./secanc 2050 1960 2011 bef2000 aml.svg anges i en terminal. Själva diagrammen genereras med hjälp av paketet Chart (Docker 2014).

Incidens akut myeloisk leukemi Sverige 1960--2011 Diagrammet visar åldersstandardiserad incidens i akut myeloisk leukemi i Sverige 1960–2011. Rådata tillgängliga via Socialstyrelsen (2015).

Haskells krav på typsäkerhet gör att datatabeller är litet mer komplicerade att hantera än i språk som Python, vilket kan vara en bidragande orsak till att utvecklingen av verktyg som Frames hållits tillbaka. Frames använder sig av s.k. Template Haskell för att med hjälp av källfilen för en tabell baka in kod som definierar tabellstrukturen i programmet vid kompileringen. När jag försökte göra det med hela IncWebR2011.txt identifierades inte alla kolumntyper korrekt: vissa kolumner med flyttal kom t.ex. att definieras som booleska värden, vilket fick till följd att kanske 95 procent av raderna ignorerades. Jag löste det genom att klippa ut de tre första raderna i filen och använda dem för att läsa in strukturen.

Sedan är det inte riktigt praktiskt att ha 24 olika typer för de olika incidenskolumnerna; det vore mer hanterligt att ha tabellen i ”långt” format, med en incidenskolumn och sedan en textkolumn för att ange åldersgrupp eller standardbefolkning. Det finns en funktion melt för att ”smälta” tabeller och göra just detta (liknande funktioner finns tillgängliga för de ovannämnda etablerade språken). Dessvärre äter funktionen upp minnet i datorn när jag försöker använda den på den aktuella tabellen; vet inte om jag gör något dumt eller om det är en bugg (eller kanske båda delarna).

Referenser

Cowley, Anthony. 2015a. ”Frames”. https://hackage.haskell.org/package/Frames.

———. 2015b. ”Frames tutorial”. http://acowley.github.io/Frames/.

Docker, Tim. 2014. ”Chart”. https://hackage.haskell.org/package/Chart.

HaskellWiki. 2015. ”Introduction”. https://wiki.haskell.org/Introduction.

Metz, Cade. 2015. ”Facebook’s new spam-killer hints at the future of coding”. Wired (1 september). http://www.wired.com/2015/09/facebooks-new-anti-spam-system-hints-future-coding/.

Socialstyrelsen. 2015. ”Cancerstatistik”. http://www.socialstyrelsen.se/statistik/statistikefteramne/cancer.

Skylla på otur

Nyligen har det publicerats en artikel i Nature om riskfaktorer och cancerutveckling (Wu m.fl. 2015). Artikeln är ett svar på Tomasetti och Vogelstein (2015), som diskuterade samband mellan antal stamcelldelningar och risk för cancer i olika vävnader. Den artikeln blev uppmärksammad i media för slutsatsen att cancer mestadels beror på ”otur”, vilket jag skrev om här den 2 januari och 5 januari. Wu m.fl. (2015) vill i stället framhålla betydelsen av miljöfaktorer. De har bl.a. en modell där den ”intrinsikala” cancerrisken, som inte kan påverkas av miljöfaktorer, representeras av den minimala cancerrisken i en vävnad givet ett antal stamcelldelningar. Utöver detta anför de epidemiologiska data som visar på att incidensen i olika cancerformer varierar kraftigt mellan olika befolkningar och tidsperioder och fynd av signaturer för mutationer, som antas vara relaterade till miljöfaktorer, i olika cancerformer. Slutsatsen är att de icke miljöberoende faktorerna bara bidrar med 10–30 procent till utvecklingen av ”many common cancers”.

Att det finns miljöfaktorer som kan förklara utvecklingen av olika cancerformer innebär emellertid inte automatiskt att dessa faktorer är lätta att påverka, eller att vi ens kan identifiera dem i dagsläget. Wu m.fl. (2015) listar själva former, som testikelcancer, som verkar vara relaterade till miljöfaktorer, men där dessa är ”[l]argely unclear”. De identifierade faktorer som tas upp inkluderar allt från rökning och kost till föroreningar, joniserande strålning och olika infektioner. Inte ens en författare som Fanu (2011), som är generellt kritisk till hypoteser om samband mellan livsstil eller föroreningar och sjukdom, borde ha så mycket att invända mot den centrala slutsatsen i den nya artikeln, eftersom han också framhåller infektioner som orsak. Han diskuterar bl.a. att det observerats ökningar av akut leukemi när populationer blandas, vilket kan tyda på att det är en infektiös agent som utlöser sjukdomen. Det kan röra sig om idag helt okända typer av patogener, hävdar han och jämför med upptäckterna av sådant som retrovirus (som HIV) och prioner. Kanske kommer sjukdomarnas orsaker att hittas i sådana outforskade områden, ”[o]r perhaps they never will” (Fanu 2011, 413).

Även när vi känner till påverkbara faktorer bakom vanliga cancerformer, kan det vara svårare att påverka den totala cancerincidensen än att påverka incidensen i specifika former. En faktor som medför minskad incidens i en form av cancer kan medföra ökad incidens i en annan – genom selektiv överlevnad eller genom direkta effekter på de processer som leder till de olika formerna. Infektion med H. pylori verkar t.ex. påverka cancer i olika delar av matsmältningskanalen i olika riktning (Venerito m.fl. 2015). Några befolkningar med någorlunda heltäckande statistik över dödsorsaker och exceptionellt låga åldersspecifika dödstal i cancer generellt (jämfört med dagens Sverige) verkar inte existera.

I förra inlägget skrev jag om hur det geometriska medelvärdet av den åldersstandardiserade incidensen för olika cancerformer (alla tredjepositionskoder i ICD-7 med minst 50 fall per år) i Sverige inte förändrats påtagligt sedan början av 70-talet. Nedanstående diagram visar detta värde relativt 2011 (det senaste år som finns med i matriserna hos Socialstyrelsen (2015)) för perioden från 1958 (då Cancerregistret startade) till 2010.

Cancerincidens Sverige 1958--2010 relativt 2011 Diagrammet visar geometriskt medelvärde av incidenskvot relativt 2011 för tredjepositionskoder i ICD-7 i Sverige (alla åldrar, åldersstandardiserat till den svenska befolkningen 2000).

Medelvärdet ökade fram till början av 70-talet och har sedan legat relativt konstant. Den generella ökningen under den första tiden kan vara relaterad till både miljöfaktorer och förbättrad diagnostik. Sedan tidigt 70-tal har den åldersstandardiserade incidensen i cancer totalt ökat med ytterligare ca 40 procent, men det beror på en ökning av ett fåtal vanliga former som till stor del tycks vara relaterad till screening och nya diagnostiska metoder. Detta avspeglas i sin tur i minskad entropi i fördelningen av de olika cancerformerna. Den 5 oktober och 12 oktober förra året skrev jag om entropin i fördelningen av dödsorsaker: den minskar vid hög ålder, men tycks för olika åldersgrupperna ha ökat över tid, vilket kan spegla mer precis diagnostik. Nedanstående diagram visar utvecklingen av entropin i fördelningen av tredjepositionskoderna i ICD-7 1958–2011 för alla cancerfall i Sverige.

Entropi cancer Sverige 1958--2011 Diagrammet visar entropin i fördelningen av tredjepositionskoder i ICD-7 i Sverige (alla åldrar).

Entropin har alltså minskat sedan 80-talet, i synnerhet bland män. Cancer bland män har blivit en alltmer homogen grupp, i allt större utsträckning sammansatt av prostatacancer, som i många fall nog aldrig skulle ha upptäckts utan PSA-test. Som en ytterligare illustration visar nedanstående diagram åldersstandardiserad incidens 1971 versus 2011 för alla tredjepositionskoder med minst 50 fall båda åren. Det geometriska medelvärdet av kvoten mellan åren \(y\) och \(x\) med incidensen \(I\) för \(n\) koder är: \[\exp\left[\frac{1}{n}\sum_{i=1}^n\log(Iy)-\log(Ix)\right]\]

Uttrycket inom hakparenteser är alltså det vanliga (aritmetiska) medelvärdet av avståndet i \(y\)-led från diagonallinjen i diagrammen nedan (med \(y=2011\) och \(x=1971\)).

Cancerincidens kvinnor Sverige 2011 vs 1971 Cancerincidens män Sverige 2011 vs 1971 Diagrammen visar logaritmerna av cancerincidens bland kvinnor och män i Sverige 2011 och 1971 för tredjepositionskoder i ICD-7 (alla åldrar, åldersstandardiserat till den svenska befolkningen 2000).

De former som ligger högt över diagonallinjen är framför allt melanom (190) och annan hudcancer (191) bland båda könen och lungcancer (162) bland kvinnor. Det är troligt att dessa ökningar åtminstone till en del är relaterade till miljöfaktorer som solbränna och rökning. För bröstcancer (170) och prostatacancer (177) har det inte skett så stora relativa ökningar, men de får stort genomslag då de redan på 70-talet var de vanligaste formerna (relativt den aktuella kodmängden) bland kvinnor respektive män. Magsäckscancer (151) ligger långt under diagonallinjen: den kraftiga minskningen här kan bl.a. bero på mindre infektioner med H. pylori i yngre kohorter. För de flesta övriga former har inga dramatiska förändringar ägt rum.

Referenser

Fanu, James Le. 2011. The rise and fall of modern medicine. 2. uppl.

Socialstyrelsen. 2015. ”Cancerstatistik”. http://www.socialstyrelsen.se/statistik/statistikefteramne/cancer.

Tomasetti, Cristian och Bert Vogelstein. 2015. ”Variation in cancer risk among tissues can be explained by the number of stem cell divisions”. Science 347 (6217): 78–81. doi:10.1126/science.1260825.

Venerito, Marino, Riccardo Vasapolli, Theodoros Rokkas och Peter Malfertheiner. 2015. ”Helicobacter pylori and gastrointestinal malignancies”. Helicobacter 20: 36–39. doi:10.1111/hel.12255.

Wu, Song, Scott Powers, Wei Zhu och Yusuf A. Hannun. 2015. ”Substantial contribution of extrinsic risk factors to cancer development”. Nature advance online publication (16 december). doi:10.1038/nature16166.

Fjolårets cellrevolter

Socialstyrelsen har offentliggjort statistik över cancerfallen i Sverige under 2014 (Socialstyrelsen 2015a). I rapporten jämförs olika sätt att bedöma utveckling av cancer över tid. Det absoluta antalet fall har mer än fördubblats sedan 1970. Antalet fall i relation till folkmängden (incidensen) har ökat med ca 90 procent, och den åldersstandardiserade incidensen (med 2000 års svenska befolkning som standardbefolkning) har ökat med ca 40 procent. Vad kan denna återstående ökning bero på? De nämner dels ”diagnostiska metoder, förändring av kodningspraxis, obduktionsfrekvenser och screeningaktiviteter”, dels förändringar i riskfaktorer, som rökvanor och exponering för UV-strålning (Socialstyrelsen 2015a, 19). Något enkelt sätt att avgöra betydelsen av dessa olika saker finns inte.

När det gäller vissa former har det nog skett en genuin ökning av sjukligheten de senaste decennierna till följd av riskfaktorer som de ovannämnda: det gäller t.ex. malignt melanom och lungcancer bland kvinnor, som dock nu börjat minska i åldrarna under 55 år. Men eftersom sjukdomarna utvecklas över lång tid har olika födelsekohorters historiska exponering ofta större betydelse än exponeringen för riskfaktorer de senaste åren. Levercancer har ökat det senaste årtiondet: kanske hänger detta samman med ökad prevalens av kronisk hepatit (som man vet kan orsaka denna form av cancer) bland missbrukare eller invandrare från delar av världen där dessa infektioner är vanliga.

I andra fall är det tydligt att ökad diagnostik spelar in. Prostatacancer ökade kraftigt från 90-talet fram till mitten av förra årtiondet, vilket hänger samman med användning av PSA-test. De senaste åren har det, som påpekas av Socialstyrelsen (2015a), skett en ökning i Stockholms län till följd av en stor studie vid Karolinska Institutet. Stockholms län hade 2014 nästan dubbelt så hög incidens som Uppsala och Södermanland. Kanske är det föga fruktbart att fråga sig om den ”verkliga” incidensen i prostatacancer förändrats, med tanke på att detta tillstånd verkar vara mer eller mindre universellt bland äldre män. Man kan undra om aggressiv prostatacancer blivit vanligare, men det går inte att utläsa från statistiken, även om dödstalen minskat sedan 90-talet. För bröst- och tjocktarmscancer ses också ökande incidens i förening med ökad användning av olika metoder för tidig diagnostik och sjunkande dödstal.

Det ser ut som åldersstandardiserad incidens i leukemi ökat påtagligt de senaste 10 åren (med 1,4 och 2,9 procent per år bland kvinnor och män). Men hela ökningen kan förklaras av två koder i ICD-7 (som fortfarande används i redovisning av cancerstatistiken): 205.9 (ospecificerad myeloisk leukemi) och 207.9 (ospecificerad leukemi)1. I dessa koder inkluderas sedan 2013 års statistik s.k. myelodysplastiska syndrom, som tidigare betraktades som förstadier till leukemi (Socialstyrelsen 2014, 11). Omräkning har skett bakåt i tiden för att göra statistiken jämförbar, så incidensen i dessa syndrom måste ha ökat. De diagnostiseras i regel bland äldre personer och ger ofta diffusa eller inga symptom. Med hänsyn till detta är det troligt att de är mer känsliga för artificiella trender än t.ex. akut lymfatisk eller myeloisk leukemi (som inte ökat de senaste decennierna).

Om vi vill studera faktorer som bidrar till ökad incidens i cancer i allmänhet ter det sig nödvändigt att titta på fördelningen av relativa trender för fler former än bara de vanligaste, som får stort genomslag i statistiken. Via Socialstyrelsen (2015b) finns incidensmatriser tillgängliga fram till 2011 (det uppges att de skall uppdateras i början av nästa år). Givet att filen med cancerincidens i riket laddats ned och packats upp läser följande Pythonkod in incidensmatrisen i en dataram och definierar en funktion som slår samman två år till en ny ram med en kolumn innehållande kvoten av en given incidenskolumn för de båda åren.

import pandas as pd

canc = pd.read_csv('IncWebR2011.txt', sep = '\t')

def calc_incrat(sex, numyr, denomyr, col, mincases = 50,
        codes = [str(code) for code in range(140, 210)]):
    subframes = []
    for yr in [numyr, denomyr]:
        subframes.append(canc.loc[(canc.Sex == sex) 
            & (canc.Year == yr) & (canc.cases0 >= mincases) & 
            (canc.icd7.isin(codes))])

    merged = pd.merge(subframes[0], subframes[1], on = 'icd7')
    merged['incrat'] = merged[col + '_x'] / merged[col + '_y']
    return merged

Givet dessa definitioner innehåller kolumnen incrat i den ram som returneras av calc_incrat(2, 2011, 1970, 'Bef2000') kvoten av kvinnornas incidens 2011 och 1970 åldersstandardiserad till 2000 års befolkning, för alla koder på tredjepositionsnivån i ICD-7 med minst 50 fall båda åren. Det geometriska medelvärdet av denna kolumn i exemplet är ca 1,05, alltså en 5-procentig ökning i genomsnitt. För männen ligger motsvarande medelvärde på ca 1,09. Resultaten bör kanske tolkas med viss försiktighet, eftersom individueringen av de olika cancerformerna i viss mån kan vara godtycklig (vilket kan jämföras med när folk pratar om ”den vanligaste dödsorsaken” och liknande). Det ser dock ut som ökningen av åldersstandardiserad incidens sedan 1970 till största delen beror på några vanliga cancerformer som inte är representativa för hela gruppen av cancersjukdomar.

Den 6 november 2011 skrev jag att den allmänna tendensen är att incidensen i cancerformer med god överlevnad ökat, samtidigt som den förblivit oförändrad eller minskat i former med dålig överlevnad. De senare formerna ligger ofta i inre organ och är svåra att upptäcka på tidigt stadium. Därför kan de förväntas vara mindre känsliga för trender beroende av ökad diagnostik än formerna med bättre prognos. Dessutom är det alltså så att vissa vanliga former tenderar att bli ännu vanligare. Det är också linje i med att det är just när det gäller dessa former, där förbättrad överlevnad kan medföra en stor folkhälsovinst, som samhället kan förväntas satsa på metoder för screening och effektivare diagnostik.

Referenser

Socialstyrelsen. 2014. Cancerincidens i Sverige 2013. http://www.socialstyrelsen.se/publikationer2014/2014-12-10.

———. 2015a. Cancerincidens i Sverige 2014. http://www.socialstyrelsen.se/publikationer2015/2015-12-26.

———. 2015b. ”Cancerstatistik”. http://www.socialstyrelsen.se/statistik/statistikefteramne/cancer.


  1. Strängt taget kommer just leukemikoderna från ICD-8, även om kolumnen heter ”ICD7”.

Datorlös utvecklare

För några dagar sedan publicerades i SvD en understreckare med anledning av att det idag, den 10 december 2015, är 200 år sedan Ada Lovelace, som beskrivits som världens första programmerare, föddes (Burman 2015). Även Häggström (2015) uppmärksammar detta jubileum, som han menar är något mycket större än Nobeldagen. Lovelace samarbetade med Charles Babbage, som beskrev en Analytical Engine, som, om den färdigställts under 1800-talet, hade blivit världens första datorsystem med ett turingfullständigt maskinspråk. Turingfullständighet är en egenskap som innebär att ett system kan beräkna varje beräkningsbar funktion1. Egenskapen kan gälla dels programmeringsspråk (moderna programmeringsspråk är i regel turingfullständiga)2, dels fysiska datorer (som dock inte uppfyller den fullständigt, eftersom de har begränsat minne). Lovelace utarbetade bl.a. en algoritm för att med hjälp av denna tilltänkta maskin generera Bernoullital. Dessutom diskuterade hon hur maskinen skulle kunna användas för att utföra uppgifter utöver manipulation av siffror, som skulle kunna beskrivas matematiskt, som att komponera musik.

Lovelace dog i cancer 1852 – en av medlemmarna i den otursamma [35, 39]-klubb, som annars inkluderar personer som Bob Marley, Arthur Rimbaud, Eva X Moberg och den Karin som beskrivs av Malmquist (2015). Babbage dog vid 79 års ålder 1871, utan att ha förverkligat sin analytiska maskin. Både Burman (2015) och Häggström (2015) framhåller skönlitteratur som diskuterar vad som hade hänt om Lovelace och Babbage fått maskinen färdig under 1800-talet. Detta kontrafaktiska scenario kan vi inte veta mycket om: Burman säger att kontrafaktisk historia är ”både lockande och ovetenskaplig” (fast ägnar sig inte seriösa historiker åt orsaksförklaringar, som kan antas ge stöd åt vissa påståenden om hur det hade gått om ett visst villkor inte varit uppfyllt?). Med hänsyn till de resonemang kring känsligheten hos personlig identitet som utvecklats av Parfit (1984) (hade våra föräldrar väntat bara ett litet tag, eller haft litet mer bråttom, hade det varit andra än vi som existerat) kanske det ändå är rimligt att tro att ingen av de personer födda under 1900-talet som refereras i detta inlägg hade existerat.

Referenser

Burman, Annie. 2015. ”Programmerade hundra år före den första datorn”. SvD (6 december). http://www.svd.se/programmerade-hundra-ar-fore-den-forsta-datorn.

Häggström, Olle. 2015. ”Ada Lovelace 200 år”. http://haggstrom.blogspot.se/2015/12/ada-lovelace-200-ar.html.

Malmquist, Tom. 2015. I varje ögonblick är vi fortfarande vid liv. 1. utg. http://libris.kb.se/bib/17858407.

Parfit, Derek. 1984. Reasons and persons. http://libris.kb.se/bib/4625211.

Turner, D. A. 2004. ”Total functional programming”. Journal of Universal Computer Science 10 (7) (28 juli): 751–768. http://www.jucs.org/jucs_10_7/total_functional_programming.


  1. Om Church–Turings hypotes är korrekt.

  2. Ett undantag är språk som Coq och Agda, som kräver att alla program terminerar. Språk av denna typ används för formella bevis, och utan en sådan restriktion skulle det gå att bevisa motsägelser (Turner 2004).