diff --git a/Kandi.tex b/Kandi.tex index 8f0b765ccba77d631a3b0033c159035fcfa897b6..1407a87fa7a1a6bc5ca653da1bbe2454d14bd664 100644 --- a/Kandi.tex +++ b/Kandi.tex @@ -24,6 +24,7 @@ \usepackage{graphicx} % kuvat \graphicspath{ {./figures/} } \usepackage{subcaption} % alitekstit +\usepackage[margin=1.5cm]{caption} \usepackage{mdframed} % määritelmien raamit @@ -51,6 +52,9 @@ \newcommand{\M}{\mathcal{M}} % "fancy M" \newcommand{\B}{\mathcal{B}} % "fancy B" \newcommand{\RR}{\mathcal{R}} % supistusalgon R +\newcommand{\invlogit}{\text{logit}^{-1}} + +\usepackage{bbm} % Indikaattorifunktio \newcommand{\R}{\mathbb{R}} \newcommand{\C}{\mathbb{C}} @@ -81,10 +85,11 @@ \addtolength{\voffset}{0.45cm} \addtolength{\textheight}{-0.9cm} -\title{Kandidaatintutkielma\\ {\Large Kausaalipäättely valikoitumisharhan korjaamisessa}} % Parempi otsikko +\title{Kandidaatintutkielma\\ {\Large Kontrafaktuaalinen imputointi}} % Parempi otsikko \author{Riku Laine\\ Valtiotieteellinen tiedekunta \\ Helsingin yliopisto} \date{\today} + %%%%%%%%%%%%%% % % Tärkeitä termejä @@ -102,12 +107,14 @@ %%%%%%%%% -\chapter*{Kiitokset -- Acknowledgements}\label{epkiit} +\chapter*{Esipuhe}\label{epkiit} %Tämän tutkielman aikana on tullut esiin takuujärjestelmään liittyvät ongelmat ja sovellusalueen yhteiskunnallinen merkitys. %Tutkielman teko on ollut minulle erityisen mielekästä antoisan aiheen ja mieleisten yhteistyökumppanien vuoksi. Olen kirjoittanut tämän kandidaatintutkielman yhteistyössä Helsingin yliopiston tietojenkäsittelytieteen osaston apulaisprofessorin Michael Mathioudakiksen ja tohtoritutkijan Antti Hyttisen kanssa. He tarjosivat minulle aiheen ja merkittävää tukea sekä tärkeitä kommentteja tämän tutkielman kirjoittamisen aikana. -Tämän tutkielman on tarkastanut XYZ. %Haluan kiittää kaikkia edellä mainittuja henkilöitä sekä ystäviäni ja perhettäni, jotka tukivat minua tämän tutkielman tekemisessä. +Tämän tutkielman on tarkastanut XYZ. + +% Kenen rahoituksella jne \bigskip @@ -120,12 +127,56 @@ Tämän tutkielman on tarkastanut XYZ. %Haluan kiittää kaikkia edellä mainitt \bigskip -\noindent I would like to wholeheartedly thank assistant professor Michael Mathioudakis from University of Helsinki's Department of Computer Science for mentoring my thesis. He provided me this extremely interesting thesis topic and provided insightful and encouraging comments throughout the process. -Antti Hyttinen from the same department also gave important insight in the causal modelling and commented on the content. +%\noindent I would like to thank assistant professor Michael Mathioudakis from University of Helsinki's Department of Computer Science for mentoring my thesis. He provided me this topic and provided insightful and encouraging comments throughout the process. +%Antti Hyttinen from the same department also gave important insight in causal modelling and commented on the content. \chapter{Johdanto}\label{johd} -Tämän tutkielman tavoitteena on luoda kausaalipäättelyn avulla algoritmi, jolla voimme arvioida ennustavien mallien todellista ennustuskykyä, kun käytettävissä on ainoastaan valikoitumisharhasta kärsivää aineistoa. Samankaltaista asetelmaa ovat julkaisuissaan käsitelleet muun muassa Lakkaraju ja Madras \cite{lakkaraju17, madras18}. Pyrin tutkielmassani luomaan joustavamman ja tarkemman vaihtoehdon Lakkarajun luomalle supistusalgoritmille, mutta esitän ensin yleistä taustaa kausaalipäättelystä ja valikoitumisharhasta. +Erilaisissa instituutioissa tehdään päivittäin lukemattomia ihmisten elämään suuresti vaikuttavia päätöksiä: tuomarit päättävät epäiltyjen syyllisyydestä ja lääkärit potilaiden hoidosta. Vaikka nämä päätöksentekijät ovat alansa ammattilaisia ja erikoisosaajia, ovat he kuitenkin ihmisiä, jotka voivat tehdä virheitä ja olla ennakkoluuloisia tiettyjen ihmisryhmien edustajia kohtaan. Oikeudessa annettujen päätöksien reiluutta on analysoitu paljon päätöksenteon jälkeen, on esimerkiksi tutkittu syrjitäänkö miehiä huoltajuuskiistoissa. + +Viime aikoina päätöksiä on alettu tehdä myös erilaisten algoritmien tukemana ja määräämänä. Esimerkiksi Yhdysvalloissa on luotu COMPAS-algoritmi (Correctional Offender Management Profiling for Alternative Sanctions), jolta tuomarit saavat oikeuskäsittelyn eri vaiheissa arvion epäillyn taipumuksesta tehdä uusi rikos, jos hänet päästetään vapaaksi. \cite{compas} Myöhemmin on kuitenkin huomattu, että kyseisen algoritmin ennusteet ovat olleet syrjiviä ja niiden yksinomainen käyttö vangitsemispäätöksen perusteena on sittemmin kielletty Yhdysvaltain korkeimman oikeuden päätöksellä. + +Yleisesti ottaen päätöksien automatisoinnin tavoitteena ei ole päätöksenteon nopeuttaminen tai tehostaminen vaan laadittujen päätöksien ja ennusteiden laadullinen parantaminen syrjinnän ja virheellisten päätösten poistamiseksi. Jotta syrjintä ja virheet voidaan poistaa, on ennustemallit ja algoritmit auditoitava. +Tarkkuuden ja tasapuolisuuden arviointi on tavallisimmissa sovelluksissa jokseenkin triviaalia ja useita metriikoita, kuten residuaalien neliösumma tai muut vastaavat, on sovellettu, mutta esimerkiksi edellä mainituissa oikeusprosessia koskevissa tapauksia näitä ei voi soveltaa, koska tietyltä osalta havainnoista puuttuu vastemuuttujan arvo. + +Sivuutan tässä tutkielmassa mallien sekä algoritmien reiluuden tarkastelun ja keskityn niiden suorituskyvyn arviointiin. Algoritmien reiluutta (engl. \emph{algorithmic fairness}) on tutkittu paljon ja johdatuksia voi löytää esimerkiksi Xltä ja Yltä. Käsittelen ... + +\section{Puuttuvuus ja imputointi}\label{puuttuvuus} + +Havaintoja voi puuttua erilaisissa tutkimuksissa useista eri syistä. Kyselytutkimuksissa vastauskatoa voi syntyä esimerkiksi vastaajan haluttomuudesta vastata kysymykseen tai yksinkertaisesti siitä syystä, että vastaajaa ei tavoiteta. Jos aineiston puuttuneisuusmekanismi on luonteeltaan täysin satunnainen, eli vastauksen puuttuneisuus ei liity millään tavalla mitattuihin muuttujiin, voidaan sanoa aineistoa puuttuvan \emph{täysin satunnaisesti}. Käänteisessä tapauksessa voidaan puhua \emph{ei-satunnaisesta puuttuvuudesta}. \cite{laaksonen13} + +Tässä tutkielmassa tarkasteltavassa asetelmassa havaintojen puuttuminen liittyy sekä havaittuihin että havaitsemattomiin muuttujiin. Puuttuneisuuden voidaan sanoa olevan \emph{satunnaista ehdollisesti}, koska aineistoa puuttuu vain yksilöiltä, joilla on korkea todennäköisyys haitalliseen tulokseen. (Erilaisia aineiston puuttuneisuusmekanismeja esitellään laajemmin esimerkiksi Laaksosen kirjassa \emph{Surveymetodiikka}. \cite{laaksonen13}) Puuttuneisuutta voidaan korjata imputoinnilla, jolla yritetään tehdä mahdollisimman hyvä arvaus puuttuvasta arvosta. Imputoinnin filosofinen perusta nojaa ajatukseen, että havaintoyksikön vasteella on jokin arvo, mutta sitä ei ole vain havaittu. + +Aineistoa voidaan imputoida erilaisilla menetelmillä ja malleilla. Jos aineistoa ei haluta imputoida, puuttuvaa tietoa sisältävät havainnot voidaan poistaa. Eräs yleisesti käytetty imputointimalli on lineaarinen regressiomalli. Kun lineaarista regressiota käytetään imputointiin, puuttuvan muuttujan arvoja pyritään selittämään havaittujen muuttujien avulla. Tällaista lähestymistapaa, jossa imputointi tehdään estimoidun mallin avulla, sanotaan \emph{malliluovuttajalähestymistavaksi}. Vaihtoehtoisesti puuttuva arvo voidaan imputoida toisen vastaajan arvolla, mitä kutsutaan \emph{vastaajaluovuttajalähestymistavaksi}. + +% Jos MCAR, niin keskiarvoimputointi + +\section{Valikoiva luokittelu -- seulotun aineiston ongelma}\label{sl} + +Valikoiva luokittelu (engl. \emph{selective labels}) aineiston luovana mekanismina on esitetty kuvassa \ref{valikoitumisharha}. Valikoivasti luokitellussa aineistossa päätöksentekijä tekee päätöksen henkilön piirteisiin perustuen. Hänen tavoitteena on estää haitallisen tuloksen $Y=0$ havaitseminen. Jos päätös on kielteinen $T=0$, tulosta ei havaita.\footnotemark Päätöksentekijä tekee siis päättäessään ennusteen: Mikä on tämän henkilön kohdalla epäonnistumisen todennäköisyys? + +\footnotetext{Ongelma voidaan esittää vaihtoehtoisesti myös muodossa, jossa kielteinen päätös $T=0$ määrää havainnon arvon positiiviseksi $Y=1$.} + +Havainnollistan aineiston generoivaa mekanismia tässä tutkielmassa usein lääketieteestä tai oikeuskäsittelyistä lainatuilla esimerkeillä. Henkilö on ensin mainitussa potilas ja jälkimmäisessä epäilty. Päätöksentekijä voi olla esimerkiksi lääkäri, joka päättää annetaanko potilaalle vahvempaa -- ja ehkä kalliimpaa -- lääkettä, jolloin tauti ei uusiudu. Oikeuskäsittelyissä päättäjällä voidaan tarkoittaa tuomaria, joka päättää epäillyn vapauttamisesta takuita vastaan ilman pelkoa rikoksen uusimisesta. Molemmilla päättäjillä on selkeä kannustin estää haitalliset tulokset pitäen samalla päätöksistä aiheutuvat rasitteet yhteiskunnalle ja yksilöiden elämille mahdollisimman pienenä. + +Valikoiva luokittelu luo siis aineistoon havaintoja, joilta puuttuu vasteen arvo, jolla ei ole realisaatiota tai jota ei ole olemassa. Tällöin tarvitaan siis \emph{kontrafaktuaaleja}, joiden avulla voidaan arvioida, miten olisi käynyt, jos päätös olisi ollut toinen. + +\begin{figure}%[H] +\centering +\includegraphics[scale = 0.4]{valikoitumis_iso} +\caption{Valikoiva luokittelu aineiston generoivana mekanismina \cite{lakkaraju17}} +\label{valikoitumisharha} +\end{figure} + +\section{Kausaatio ja kontrafaktuaalit} + +Perinteisen tilastollisen tutkimuksen tavoitteena on havaita \emph{assosiaatioita} tapahtumien välillä ja tehdä niiden pohjalta päättelyä. \cite{kalisch13} Luonnossa havaitaan tapahtumia ja niiden yhteyksiä sovitetaan erilaisiin malleihin ja lopulta näiden yhteyksien avulla voidaan pyrkiä ennustamaan tapahtumia. Usein kuitenkin tutkijat haluavat vastauksia syy-seuraussuhteita eli \emph{kausaatiota} sisältäviin kysymyksiin, kuten "Paraniko henkilö, koska hän sai lääkettä?" tai "Maksetaanko naisille vähemmän palkkaa?". + +Kuten tavallisissa tilastollisissa ongelmissa, syy-seuraussuhteita sisältävien ongelmien käsittelyyn tarvitaan malli. Mallit ovat ilmiöiden yksinkertaistuksia, jotka perustuvat teorioihin ja tietoon havainnoitavista ilmiöistä (kimmo). Kahden muuttujan $x$ ja $y$ lineaarista yhteyttä voidaan havainnollistaa lineaarisella mallilla $y = \beta x + \epsilon$, missä $\epsilon$ ilmaisee malliin liittyvää epävarmuutta. Tällainen yksinkertainen assosiatiivinen yhteys voidaan kääntää muotoon $x = \frac{y}{\beta}$. Kausatiivissa kysymyksissä syytä ei voida kuitenkaan vaihtaa seuraukseksi, joten malli on luontevaa määrittää verkkona. Tällaisia verkkomalleja sanotaan rakenteellisiksi kausaalimalleiksi (\emph{structural causal model}) ja ne rakennetaan kuten mikä tahansa muu malli, parhaan mahdollisen nykytiedon pohjalle. + +Kausaalimallin avulla voidaan määrittää myös vaihtoehtoisia totuuksia, eli kontrafaktuaaleja. Kontrafaktuaalien avulla jossittelu voidaan määrittää matemaattisena ilmiönä. Kontrafaktuaalit vastaavat kysymyksiin miten olisi käynyt jos asiat olisivat olleet toisin. Kausaatiota voidaan määrittää kolmella eri tavalla, Rubin vs Pearl vs Arjas + ? (eerola). Pearl on kuitenkin osoittanut, että Rubinin malli on yhtäpitävä hänen esittämänsä version kanssa. + +%Tämän tutkielman tavoitteena on luoda kausaalipäättelyn avulla algoritmi, jolla voimme arvioida ennustavien mallien todellista ennustuskykyä, kun käytettävissä on ainoastaan valikoitumisharhasta kärsivää aineistoa. Samankaltaista asetelmaa ovat julkaisuissaan käsitelleet muun muassa Lakkaraju ja Madras \cite{lakkaraju17, madras18}. Pyrin tutkielmassani luomaan joustavamman ja tarkemman vaihtoehdon Lakkarajun luomalle supistusalgoritmille, mutta esitän ensin yleistä taustaa kausaalipäättelystä ja valikoitumisharhasta. %Tässä kappaleessa esittelen tutkielman taustaa ja yhdysvaltalaisen oikeuslaitoksen takuukäsittelyprosessin yleisellä tasolla. Sen jälkeen paneudun hieman vangitsemispäätöksen yhteiskunnalliseen merkitykseen: minkä takia ihmisiä vangitaan ja mitä perusteita on vangitsemattajättämispäätökselle. Pyrin luvun aikana myös hieman selvittämään takuujärjestelmän käyttöä Suomessa ja kappaleen lopussa pohdin hieman kausaalipäättelyä paradigman muutoksena tilastotieteen kentällä. Jätän kuitenkin tarvittavien merkintöjen esittämisen kappaleeseen \emph{\nameref{kausaalimerk}} ja mallin esittelyn \emph{\nameref{kausaalimalli}}-lukuun. @@ -157,439 +208,411 @@ Tämän tutkielman tavoitteena on luoda kausaalipäättelyn avulla algoritmi, jo %Ongelmana tässä on se, millä perustein tuomarit tekevät päätöksen bailille pääsemisestä on käynyt ilmi (linkkaa propublica), että vaikka he käyttävät yhdysvaltalaisen yhtiön North -%%%%%%%%% - -\section{''Kausaalipäättely uutena paradigmana''}\label{para} % miksi halutaan siirtyä (frekventistisen / bayes-päättelyn ongelmat), edut, esiintyminen, erot, käyttö -Judea Pearl ja Mackenzie esittävät kirjassaan Miksi, että ihmisillä on luontainen kausaalisen päättelyn taito \cite{miksi}. Tavalliset tilastollisen päättelyn menetelmät eivät tarjoa tapaa määritellä kausaalista yhteyttä: aineistosta voidaan päätellä erilaisia \emph{korrelaatioita}, mutta kausaalista päättelyä \emph{A johtuu B:stä} ei voida tehdä perinteisen tilastotieteen keinoin. Käytännön tutkimuksessa kausaaliset yhteydet kiinnostavat erityisesti lääketieteen alalla \cite{pearl10}. Kuten Kalisch toteaa, aiemmin kausaalisuuden päättely on perustunut korrelaatioiden havaitsemiseen. On hypotetisoitu, että jonkinlaisen biomarkkerin ja taudin samanaikainen havaitseminen viittaisi siihen, että markkeri aiheuttaa taudin. Voimmeko siis markkeria käsittelemällä vaikuttaa tautiin tai jopa parantaa sen? \cite{kalisch14} - -Syy-seuraussuhteen matemaattinen määrittely vaatii uutta lähestymistä myös todennäköisyyslaskennan merkintöihin. Pearl käyttää alkuperäisessä, englanninkielisessä kirjallisuudessa merkintää 'do' ilmaisemaan interventiota. Merkinnällä halutaan erottaa tavanomainen ehdollinen todennäköisyys $\pr(Y|X=x)$ interventiosta, jossa asetamme muuttujan $X$ arvoon $x$: $\pr(Y|\text{do}(X=x))$. Kausaalipäättelyyn liittyvät myös oleellisesti kontrafaktuaalit, jotka kuvaavat muuttujien mahdollisia arvoja, jos jokin toinen muuttuja olisi ollut erilainen -- "sateen todennäköisyys, jos taivaalla olisi ollut pilviä". Esimerkiksi muuttujan $Y$ arvoa, jos $X$ olisi ollut $x$ asteikolla $u$ merkittäisiin $Y_x(u)$. Tässä tutkielmassa käsittelen kuitenkin vain Pearlin kausaalimallia. Esittelen käyttämäni merkinnät tarkemmin kappaleessa \ref{kausaalimerk_laus}. - -Kausaalipäättelyssä mallit voidaan esittää graafeina, eli verkkoina. Verkoista voidaan suoraan lukea eri muuttujien syy-seuraussuhteet ja riippuvuudet tai riippumattomuudet. -%%%%%%%%% - -\section{Valikoitumisharha -- seulotun aineiston ongelma}\label{sl} - -Havaintoja voi puuttua erilaisissa tutkimuksissa useista eri syistä. Kyselytutkimuksissa vastauskatoa voi syntyä esimerkiksi vastaajan haluttomuudesta vastata kysymykseen tai yksinkertaisesti siitä syystä, että vastaajaa ei tavoiteta. Jos aineiston puuttuneisuusmekanismi on luonteeltaan täysin satunnainen, eli vastauksen puuttuneisuus ei liity millään tavalla mitattuihin muuttujiin, voidaan sanoa aineistoa puuttuvan \emph{täysin satunnaisesti}. Käänteisessä tapauksessa voidaan puhua \emph{ei-satunnaisesta puuttuvuudesta}. \cite{laaksonen13} - -Tässä tutkielmassa tarkasteltavassa asetelmassa havaintojen puuttuminen liittyy sekä havaittuihin että havaitsemattomiin muuttujiin. Puuttuneisuuden voidaan sanoa olevan \emph{satunnaista ehdollisesti}, koska aineistoa puuttuu vain yksilöiltä, joilla on korkea todennäköisyys haitalliseen tulokseen. (Erilaisia aineiston puuttuneisuusmekanismeja esitellään laajemmin esimerkiksi Laaksosen kirjassa \emph{Surveymetodiikka}.) Puuttuneisuutta voidaan korjata imputoinnilla, jolla yritetään tehdä mahdollisimman hyvä arvaus puuttuvasta arvosta. Todistan tutkielmassani myöhemmin, että kausaalipäättelyä hyödyntämällä voimme estimoida havaitusta, valikoitumisharhaisesta aineistosta haluttuja tunnuslukuja ilman imputointia harhattomasti. \cite{laaksonen13} Englanninkielisessä kirjallisuudessa seulotun aineiston ongelmasta on alettu käyttää Lakkarajun esittämää termiä \emph{selective labels} \cite{lakkaraju17}. % se lähde, missä näin väitettiin - -Aineiston luova mekanismi on esitetty kuvassa \ref{valikoitumisharha} ja toimii siten, että aluksi jokin henkilö tai muu entiteetti saapuu päätöksentekijän eteen seulottavaksi. Päätöksentekijän tavoitteena on estää haitallinen tulos ($y=0$) pitäen samalla myönteisten päätösten ($t=1$) määrä mahdollisimman pienenä. Seuloja pyrkii siis antamaan kielteisen päätöksen kaikille niille, joilla epäonnistuminen on todennäköisin. Päätöksen jälkeen Kohtalo määrittää havainnolle tuloksen $y\in\{0, 1\}$. Kielteisen päätöksen saaneille tulos voidaan merkitä puuttuvaksi tai onnistuneeksi, koska haitallista tapahtumaa ei havaita. - -Aineiston generoivaa mekanismia voidaan havainnollistaa lääke- ja oikeustieteen alan esimerkeillä. Henkilö on ensin mainitussa potilas ja jälkimmäisessä epäilty. Seuloja voi olla esimerkiksi lääkäri, joka päättää annetaanko potilaalle vahvempaa ja samalla kalliimpaa lääkettä, jolloin relapsia ei havaita. Oikeudellisessa asetelmassa seulojalla voidaan tarkoittaa tuomaria, joka päättää epäillyn vapauttamisesta takuita vastaan ilman pelkoa rikoksen uusimisesta. Molemmilla päättäjillä on selkeä kannustin estää haitalliset tulokset -- sairauskohtaukset tai rikokset -- pitäen samalla päätöksistä aiheutuvat rasitteet yhteiskunnalle ja yksilöiden elämille mahdollisimman pienenä. Lisäksi erityisesti oikeudellisessa asetelmassa on selvää, kuinka takuukäsittelystä kielteisen tuloksen saaneet eivät voi syyllistyä uuteen rikokseen, joten heidän tulosmuuttujan arvo voidaan merkitä joko onnistumiseksi tai havaitsemattomaksi. - -\begin{figure}%[H] -\centering -\includegraphics[scale = 0.4]{valikoitumis_iso} -\caption{Valikoitumisharha aineiston generoivana mekanismina \cite{lakkaraju17}} -\label{valikoitumisharha} -\end{figure} - -%%%%%%%%% -%%%%%%%%% -%%%%%%%%% - -\chapter{Aineiston generointi}\label{aineisto} - - -%%%%%%%%%% +%Judea Pearl ja Mackenzie esittävät kirjassaan Miksi, että ihmisillä on luontainen kausaalisen päättelyn taito \cite{miksi}. Tavalliset tilastollisen päättelyn menetelmät eivät tarjoa tapaa määritellä kausaalista yhteyttä: aineistosta voidaan päätellä erilaisia \emph{korrelaatioita}, mutta kausaalista päättelyä \emph{A johtuu B:stä} ei voida tehdä perinteisen tilastotieteen keinoin. Käytännön tutkimuksessa kausaaliset yhteydet kiinnostavat erityisesti lääketieteen alalla \cite{pearl10}. Kuten Kalisch toteaa, aiemmin kausaalisuuden päättely on perustunut korrelaatioiden havaitsemiseen. On hypotetisoitu, että jonkinlaisen biomarkkerin ja taudin samanaikainen havaitseminen viittaisi siihen, että markkeri aiheuttaa taudin. Voimmeko siis markkeria käsittelemällä vaikuttaa tautiin tai jopa parantaa sen? \cite{kalisch14} % -%\section{COMPAS}\label{compas} +%Syy-seuraussuhteen matemaattinen määrittely vaatii uutta lähestymistä myös todennäköisyyslaskentaan. Kausaalipäättelyyn liittyvät oleellisesti kontrafaktuaalit, jotka kuvaavat muuttujien mahdollisia arvoja, jos jokin toinen muuttuja olisi ollut erilainen -- "palkan määrä, jos olisi hankkinut korkeamman tutkinnon". Kontrafaktuaalien määrittämiseen rakenneyhtälömallit ja kausaaliset rakennemallit % -%COMPAS-aineisto (Correctional Offender Management Profiling for Alternative Sanctions) on alun perin ProPublica-julkaisun koostama aineisto yhteensä 18 610 amerikkalaisesta. Aineistossa on muun muassa heidän demografiset tiedot, kuten ikä, sukupuoli ja rotu, ja rikoshistoriaan liittyvät tiedot. Oikeammin COMPAS viittaa Northpointe-yhtiön työkaluun, joka antaa arvion epäillyn rikoksenuusintariskistä. Arvio perustuu epäillyn vastauksiin kyselyyn, jossa tiedustellaan hänen taustoistaan, kuten lähipiirin huumeidenkäytöstä ja epäillyn taipumuksesta väkivaltaisuuteen. ProPublica kokosi aineiston alun perin paljastaakseen arvion tuottavan algoritmin mustia syrjivän luonteen. ProPublican analyysi osoitti, että mustat saivat järjestelmällisesti korkeamman riskiarvion kuin valkoihoiset. \cite{propublica16} -% -%ProPublica esittää artikkelinsa metodologiaosiossa, kuinka he ovat päätyneet lopulliseen aineistoon, joka käsittää tiedot 6172 henkilöstä. Pääpiirteissään he ovat siistineet aineistoa siten, että se yhdistää oikeat henkilöt oikeisiin pisteytyksiin ja oikeisiin uusintatuomioihin. Joitakin johdettuja mutujia luotiin, kuten tekstuaalinen kuvaus desiilipisteytyksestä scoretext joka ryhmittää etc etc. -% -%\begin{table}[H] -%\centering -%\begin{tabular}{lrrrrrrrrrr} -%\hline \hline -% Muuttujan nimi & $\bar{x}$ & Keskihajonta & Min & 25\% & 50\% & 75\% & Max \\ -%\hline \hline -% age & 34,5 & 11,7 & 18 & 25 & 31 & 42 & 96 \\ -% priors\_count & 3,25 & 4,74 & 0 & 0 & 1 & 4 & 38 \\ \hline -% days\_b\_screening\_arrest & -1,74 & 5,08 & -30 & -1 & -1 & -1 & 30 \\ -% decile\_score & 4,42 & 2,84 & 1 & 2 & 4 & 7 & 10 \\ -% is\_recid & 0,484 & 0,500 & 0 & 0 & 0 & 1 & 1 \\ \hline -% two\_year\_recid & 0,455 & 0,498 & 0 & 0 & 0 & 1 & 1 \\ -% length\_of\_stay & 14,6 & 46,7 & -1 & 0 & 1 & 5 & 799 \\ -%\hline \hline -%\end{tabular} -%\caption{COMPAS-aineiston numeeristen muuttujien hajontalukuja} -%\label{table:1} -%\end{table} +%Esimerkiksi muuttujan $Y$ arvoa, jos $X$ olisi ollut $x$ asteikolla $u$ merkittäisiin $Y_x(u)$. Tässä tutkielmassa käsittelen kuitenkin vain Pearlin kausaalimallia. %%%%%%%%% -%\section{Synteettinen}\label{synteettinen} - -Synteettinen aineisto luotiin Lakkarajun selostamalla tavalla. Aineistoon simuloitiin kolme muuttujaa $X$, $Z$, ja $W$. Näistä muuttujista $X$ vastaa informaatiota, joka on sekä mallin että päätöksentekijän havaittavissa. Käytännössä muuttuja $X$ vastaa kirjallista informaatiota, joka on kirjattu erilaisiin pöytäkirjoihin tai rekistereihin. Muuttujalla $Z$ kuvataan tietoa, jonka vain päätöksentekijä voi havaita: kuten Lakkaraju havainnollistaa, tällaista voi olla oikeudessa esimerkiksi tieto siitä, onko vastaajalla perhettä mukana oikeussalissa. $W$ tuo malliin kohinaa. Muuttujalla esitämme aineistossa informaatiota, joka ei ole saatavilla päätöksentekijöille eikä mallille, mutta vaikuttaa silti epätoivottavan tuloksen riskiin. Aineistossa nämä ovat kaikki riippumattomia standardinormaalijakautuneita satunnaismuuttujia, eli $X, W, Z \sim N(0, 1) \independent$. \cite{lakkaraju17} - -Aineistossa jyvitämme jokaiselle $M=100$ päätöksentekijälle 500 arvioitavaa. Kaikille päättäjille arvotaan hyväksymisprosentti ottamalla arvoja tasajakaumasta suljetulta väliltä [0,1; 0,9] ja sitten pyöristämällä saadut arvot 10 desimaalin tarkkuuteen. Tulosmuuttuja Y määritetään ehdollisen todennäköisyyden -\begin{equation} \label{y_ehd} -\pr(Y=0|X, Z, W)=\dfrac{1}{1+\text{exp}\{-(\beta_XX+\beta_ZZ+\beta_WW)\}} -\end{equation} -mukaisesti. Jos $\pr(Y=0|X, Z, W) \geq 0,5$, tulosmuuttujan arvoksi asetetaan 0 ja vastaavasti jos $\pr(Y=0|X, Z, W) < 0,5$ muuttujan arvoksi asetetaan 1. Lausekkeissa \ref{y_ehd} ja \ref{t_ehd} olevat kertoimet $\beta_X$, $\beta_Z$ ja $\beta_W$ ovat 1, 1 ja 0,2 vastaavassa järjestyksessä. \cite{lakkaraju17} - -Päätösmuuttuja $T$ määritetään kaksivaiheisesti: ensin määritetään todennäköisyys kielteiselle päätökselle ja sitten muuttujan arvo asetetaan näiden todennäköisyyksien keskinäisen suuruuden ja hyväksymisasteen $r$ mukaisesti. Muuttujan $T$ ehdollinen todennäköisyys -\begin{equation} \label{t_ehd} -\pr(T=0|X, Z)=\frac{1}{1+\text{exp}\{-(\beta_XX+\beta_ZZ)\}} + \epsilon, -\end{equation} -missä $\epsilon \sim N(0, 0,1)$ vastaa pientä määrää kohinaa. Henkilölle $i$ annetaan kielteinen päätös, eli $T_i=0$, jos ehdollinen todennäköisyys $\pr(T=0)$ on seulojan $j$ suurimman $(1-r)\cdot 100\%$ joukossa. Toisin sanoen seuloja $j$ antaa myönteisen päätöksen $r$ prosentille hänen arvioitavakseen annetuista henkilöistä, joilla on alin todennäköisyys kielteiseen päätökseen, oli se sitten rikoksen uusinta tai relapsi. \cite{lakkaraju17} - -Kun aineisto oli simuloitu, se jaettiin niin sanottuihin koulutus- ja testiaineistoihin. Lopuksi molempia aineistoja muokattiin siten, että tulosmuuttujan arvo oli saatavissa vain yksilöille, joille oli annettu positiivinen päätös $(T=1)$. Kielteisen päätöksen saaneille tulosmuuttujan arvo asetettiin arvoon NA, kuten kuvassa \ref{valikoitumisharha}. Syntetisoidun aineiston keskeisimmät hajontaluvut on esitetty taulukossa \ref{synt_hl}. \cite{lakkaraju17} - -\begin{table}[H] -\centering -\begin{tabular}{lrrrrrrrrrr} -\hline \hline -Muuttuja & Keskiarvo & Keskihajonta & Minimi & 25\% & 50\% & 75\% & Maksimi \\ -\hline - acceptanceRate\_R & 0.48 & 0.23 & 0.10 & 0.26 & 0.47 & 0.65 & 0.89 \\ - X & 0.00 & 1.00 & -4.66 & -0.67 & 0.00 & 0.67 & 3.83 \\ - Z & 0.01 & 1.00 & -4.85 & -0.67 & 0.00 & 0.68 & 4.24 \\ - W & 0.01 & 1.00 & -4.03 & -0.67 & 0.01 & 0.68 & 4.29 \\ - result\_Y & 0.50 & 0.50 & 0.00 & 0.00 & 0.00 & 1.00 & 1.00 \\ -% probabilities\_T & 0.50 & 0.28 & -0.34 & 0.28 & 0.50 & 0.72 & 1.30 \\ - decision\_T & 0.48 & 0.50 & 0.00 & 0.00 & 0.00 & 1.00 & 1.00 \\ -\hline -\end{tabular} -\caption{Synteettisen aineiston muuttujien hajontalukuja} -\label{synt_hl} -\end{table} - %%%%%%%%% %%%%%%%%% %%%%%%%%% -\chapter{Menetelmät}\label{metodit} - -Tässä kappaleessa esitän tutkielmassani käyttämät metodit. Selostan supistusalgoritmin toiminnan kappaleessa \ref{contraction} sekä kausaalisen mallin laatimisessa ja arvioinnissa käyttämäni teoreettisen taustan kappaleissa \ref{verkot}. Koska kausaalinen malli esitetään verkkona, käyn aluksi läpi vaadittavat verkkoteoreettiset määritelmät. Esitän sen jälkeen mallini graafina ja osoitan kausaalisen vaikutuksen olevan identifioituva. +\chapter{Määritelmät ja teoria} -\section{Metriikat} +Erilaisten algoritmien ja mallien suorituskyvyn arviointiin on kehitetty useita tapoja. Tavan valinta liittyy usein läheisesti vastemuuttujan arvojoukkoon: binäärisiä muuttujia on luontevaa arvioida eri tavoin kuin jatkuvia. Koska tuloksen $Y$ havaitseminen riippuu päätöksestä $T$, määritetään kaksi metriikkaa -- hyväksymisprosentti (engl. \emph{acceptance rate}, (AR)) ja virheprosentti (\emph{failure rate} (FR)), joilla on hyvin intuitiiviset vastaavuudet reaalimaailmassa. -Algoritmien suorituskyvyn arviointiin liittyy kolme keskeistä metriikkaa: hyväksymisaste (engl. \emph{acceptance rate}, (AR)), epäonnistumisprosentti (\emph{failure rate} (FR)) ja keskimääräinen virhe(\emph{mean absolute error} (MAE)). +\begin{maar}[Hyväksymisprosentti (AR)] \label{AR} -\begin{maar}[Hyväksymisaste (AR)] \label{acc_rate} +Päättäjän hyväksymisprosentti määritetään myönteisten päätösten määrän suhteena annettujen päätösten kokonaismäärään. Jos päätöksentekijä antaa 100 päätöstä, joista 40 on myönteisiä, niin hänen hyväksymisprosenttinsa on $0,4$. -Päättäjän hyväksymisaste määritetään myönteisten päätösten määrän suhteena annettujen päätösten kokonaismäärään. Eli jos päätöksentekijä antaa 100 päätöstä, joista 40 on myönteisiä, niin hänen hyväksymisasteensa on $0,4$. - -\end{maar} +\end{maar} -\begin{maar}[Epäonnistumisprosentti (FR)] \label{fail_rate} +\begin{maar}[Virheprosentti (FR)] \label{FR} -Päätöksentekijän epäonnistumisprosentti määritetään epäonnistuneiden tulosten määrän suhteena annettujen päätösten kokonaismäärään. Eli jos päätöksentekijä antaa 100 päätöstä, joista 60 on myönteistä ja näistä 60 päätöksestä 30 johtaa epäonnistumiseen (esimerkiksi rikoksen uusintaan), niin tuomarin epäonnistumisprosentti on $0,3$. +Päätöksentekijän virheprosentti määritetään epäonnistuneiden tulosten määrän suhteena annettujen päätösten kokonaismäärään. Jos päätöksentekijä antaa 100 päätöstä, joista 60 on myönteistä ja näistä 60 päätöksestä 30 johtaa epäonnistumiseen (esimerkiksi rikoksen uusintaan), niin tuomarin virheprosentti on $0,3$. \end{maar} -\begin{maar}[Keskimääräinen virhe (MAE)] \label{mae} +\noindent Vertaillaksemme eri algoritmien ennusteiden tarkkuutta laskemme keskimääräisen virheen (\emph{mean absolute error} (MAE)) suhteutettuna johonkin referenssipisteeseen. Referenssipisteenä voidaan esimerkiksi käyttää epäonnistumisprosentin todellisia arvoja ja verrata eri algoritmien ennusteita käyttäen keskimääräistä virhettä. +\begin{maar}[Keskimääräinen virhe (MAE) \cite{willmott05}] \label{MAE} +Olkoot $y_i$, missä $i = 1, \ldots, n$, havaintojen todelliset arvot ja $\hat{y_i}$ ennusteet. Tällöin jatkuville muuttujille keskimääräinen virhe +$$\text{MAE} = \dfrac{\sum_{i=1}^{n}|\hat{y_i}-y_i|}{n} = \dfrac{\sum_{i=1}^{n}|e_i|}{n}$$ +ja edelleen binäärisille muuttujille +$$\text{MAE} = \dfrac{\sum_{i=1}^{n}\mathbbm{1}\{\hat{y}_i\neq y_i\}}{n}.$$ \end{maar} -\section{Supistusalgoritmi}\label{contraction} +\section{Bayes-päättely} -Supistusalgoritmi on 2017 esitetty algoritmi \cite{lakkaraju17}, jonka avulla voidaan arvioida ennustavien mallien todellista suorituskykyä, kun vain tietylle osalle aineistosta on luokka (label) saatavissa. Algoritmin toimintaperiaatteena on arvioida mallin $\B$ ennusteita löyhimmän päätöksentekijän tekemien päätösten joukossa. Algoritmin pseudokoodi on esitetty Algoritmissa \ref{contraction_alg}. +% TN -avaruus? > Todennäköisyys > jakauma/tiheysfunktio > ehdollinen tn > bayesin kaava +% https://fi.wikipedia.org/wiki/Todenn%C3%A4k%C3%B6isyysteoria -\begin{algorithm}[H] % enter the algorithm environment -\caption{Supistusalgoritmi} % give the algorithm a caption -\label{contraction_alg} % and a label for \ref{} commands later in the document -\begin{algorithmic}[1] % enter the algorithmic environment -\REQUIRE Aineisto $\D$, todennäköisyydet $\s$ ja hyväksymisaste $r$ -\ENSURE Epäonnistumisprosentti (FR) hyväksymisasteella $r$ +Bayes-päättely perustuu rakennuspalikat perustuvat pikälti Bayesin kaavaan, joka on johdettavissa ehdollisen todennäöisyyden määritelmästä. Johtaaksemme Bayesin kaavan määritetään ensin todennäköisyysavaruus ja sen tapahtumat -\STATE Olkoon $q$ päättäjä, jolla on korkein hyväksymisaste $r$. -\STATE $\D_q = \{(x, j, t, y) \in \D | j = q \}$ -\STATE \hskip3.0em $\rhd$ Nyt $\D_q$ on havaintojoukko, jolle $q$ on antanut päätökset. -\STATE -\STATE $\RR_q = \{(x, j, t, y) \in \D_q | t=1 \}$ -\STATE \hskip3.0em $\rhd$ $\RR_q$ on on joukon $\D_q$ osa, jolle tulosmuuttujan arvot on havaittu. -\STATE -\STATE Järjestä taulukoon $\RR_q$ havainnot laskevaan järjestykseen todennäköisyyksien $\s$ mukaan ja talleta ne taulukkoon $\RR_q^{sort}$ -\STATE \hskip3.0em $\rhd$ Mallin korkeariskisimmät ovat nyt listan kärjessä -\STATE -\STATE Ota taulukosta $\RR_q^{sort}$ sen $[(1.0-r)|\D_q|]-[|\D_q|-|\RR_q|]$ ensimmäistä/ylintä havaintoa ja talleta ne taulukkoon $\RR_\B$. -\STATE \hskip3.0em $\rhd$ $\RR_\B$ on lista henkilöistä, joille malli $\B$ on antanut positiivisen päätöksen -\STATE -\STATE Laske $\mathbf{u} = \sum_{i=1}^{|\RR_\B|} \dfrac{\delta\{y_i=0\}}{|\D_q|}$. +\begin{maar}[Todennäköisyysavaruus] -\RETURN $\mathbf{u}$ -\end{algorithmic} -\end{algorithm} +Kolmikko $(\Omega, \mathcal{F}, \pr)$ on \emph{todennäköisyysavaruus}, jos -%%%%%%%%%% -% -%\section{Aiemmat tutkimukset?}\label{aiemmat} -% -%Aiemmat tutkimukset ovat lähestyneet monesta näkökulmasta, mutta ilman kausaatiota. -% -%%%%%%%%%% -% -%\section{Validointimetodit}\label{validointi} -% -%Tulosten arvioinnissa käytetään -% -%Tulosten arvioinnissa käytetään visuaalista tarkastelua ja XZY. Laskemme arvioista vapaaksi päässeiden uusijoiden suhteen kaikkiin tuomittuihin, eli niin sanotun virhesuhteen (failure rate). -% -%%%%%%%%%% - -\section{Verkkoteoria}\label{verkot} - -Verkot koostuvat \emph{solmuista} ja \emph{kaarista}, joita voidaan havainnollistaa pisteinä ja viivoina tai nuolina näiden pisteiden väliilä. Kaaret ovat järjestettyjä pareja, kuten verkot itsekin, mutta oletan tavallisimmat joukko-opin merkinnät ja käsitteet tunnetuiksi. Noudatan määritelmissä Oinosta \cite{oinonen16} ja erikseen merkityissä kohdissa Kivistä \cite{tira}. -% TiRan materiaalit?? +\begin{itemize} +\item Perusjoukko $\Omega$ on epätyhjä +\item $\mathcal{F}$ on $\sigma$-algebra +\item $\pr$ on mitta +\end{itemize} -% Ota esimerkki verkko ja kirjoita siitä lyhyet havainnollistavat kommentit - -\begin{figure} [h] -\centering -\begin{tikzpicture}[->,>=stealth',node distance=2.0cm, semithick] - - \tikzstyle{every state}=[fill=none,draw=black,text=black] - - \node[state] (R) {$R$}; - \node[state] (X) [right of=R] {$X$}; - \node[state] (T) [below of=X] {$T$}; - \node[state] (Z) [right of=X] {$Z$}; - \node[state] (Y) [below of=Z] {$Y$}; - - \path (R) edge (T) - (X) edge (R) - edge (T) - edge (Y) - (Z) edge (X) - edge (T) - edge (Y) - edge [bend right] (R) - (T) edge (Y); -\end{tikzpicture} -\caption{Eräs verkko $H = (V, E)$, missä $V = \{R, X, Z, T, Y\}$.} -\label{esverkko} -\end{figure} - - -\begin{maar}[Suunnattu verkko] \label{suun_verkko} - -\emph{Suunnattu verkko G} on pari $(V, E)$, missä $V \neq \emptyset$ on \emph{solmujen} joukko ja $$E = \{(a, b) \in V \times V | \text{ solmusta } a \text{ on nuoli solmuun } b \} $$ on \emph{kaarien} joukko. - -\end{maar} +\end{maar} -\smallskip -\noindent Kuvassa \ref{esverkko} näkyvässä verkossa esimerkiksi $(X, R) \in E$, mutta $(T, Z) \notin E$, koska solmusta $T$ ei ole nuolta solmuun $Z$. Lisäksi voidaan todeta, että kaarien joukkoon kuuluu yhdeksän järjestettyä paria ja solmujen joukko $V$ käsittää viisi alkiota. -\smallskip +Frekventistisessä tilastollisessa päättelyssä tuntemattoman parametrin $\theta$ arvo on kiinnitetty vakio, kun bayesiläisessä päättelyssä parametrin arvo voidaan käsittää satunnaismuuttujana. Bayes-päättelyn tavoitteena laskea parametrille \emph{posteriorijakauma} eli posteriori $f_{\Theta|\mathbf{Y}}(\theta|\mathbf{y})$, joka kertoo parametrin jakauman, kun huomioidaan kerätty aineisto $\mathbf{y}$ ja aiempi tieto parametrin jakaumasta. Tämä aiempi tieto ilmaistaan priorijakaumana eli priorina $f_\Theta(\theta)$. Posteriori määritellään Bayesin kaavan avulla: +\begin{equation} +f_{\Theta|\mathbf{Y}}(\theta|\mathbf{y}) = \dfrac{f_{\mathbf{Y}|\Theta}(\mathbf{y}|\theta)f_\Theta(\theta)}{f_\mathbf{Y}(\mathbf{y})}, +\end{equation} +missä marginaaliuskottavuus $f_\mathbf{Y}(\mathbf{y})=\int_\Omega f_{\mathbf{Y}|\Theta}(\mathbf{y}|\theta')f_\Theta(\theta')~d\theta'$ jatkuville muuttujille (tietyin edellytyksin). On kuitenkin huomattava, että marginaaliuskottavuus $f_\mathbf{Y}(\mathbf{y})$ ei riipu parametrista $\theta$, joten posteriorin lauseketta voidaan edelleen yksinkertaistaa verrannolla -\begin{maar} % Lähtösolmu, maalisolmu, vierussolmu +\begin{equation} +f_{\Theta|\mathbf{Y}}(\theta|\mathbf{y}) \propto f_{\mathbf{Y}|\Theta}(\mathbf{y}|\theta)f_\Theta(\theta). +\end{equation} -Oletetaan, että $G=(V, E)$ on suunnattu verkko ja $a, b \in V$. \\ +\section{Kontrafaktuaalit} -\noindent Merkintä $a \rightarrow b$ tarkoittaa, että $(a, b) \in E$. Tällöin sanotaan, että $a$ on kaaren $(a, b)$ \emph{lähtösolmu} ja $b$ on kaaren $(a, b)$ \emph{maalisolmu}. Sanotaan myös, että solmu $b$ on solmun $a$ \emph{vierussolmu} tai että solmut $a$ ja $b$ ovat \emph{vierekkäisiä}. \\ +Kontrafaktuaalit liittyvät aina vastaavaan kausaalimalliin, joten määritellään ensin kausaalimalli. -\noindent Jos $(a, a) \in E$, sanotaan suunnatussa verkossa olevan \emph{silmukka} solmussa $a$. -\end{maar} +\begin{maar}[Kausaalimalli \cite{pearl10} (pearl 2009 (TIKKA))] -\noindent Esimerkkiverkossa $H$ kaaren $(Z, T)$ lähtösolmu on solmu $Z$ ja maalisolmu solmu $T$. Lisäksi huomataan, että verkossa $H$ ei ole yhtään silmukkaa. Kuvan \ref{esverkko} verkosta havaitaan, että melkein kaikki solmut ovat toistensa vierussolmuja. Ainoa poikkeus on solmut $R$ ja $Y$, joiden välillä ei ole nuolta ja jotka eivät siten ole vierekkäisiä. +Kausaalimalli $M$ on kolmikko $(\mathbf{U}, \mathbf{V}, \mathbf{F})$, missä -\begin{maar}[Yksinkertainen suunnattu verkko] \label{yk_suun_verkko} - -Oletetaan, että $G = (V,E)$ on suunnattu verkko, jossa ei ole yhtään silmukkaa eli $(v, v) \notin E$ kaikilla $v \in V$. \\ +\begin{enumerate} +\item $\mathbf{U}$ on joukko havaitsemattomia taustamuuttujia, jotka määräytyvät mallin ulkopuolisista tekijöistä +\item $\mathbf{V}=\{V_1, V_2, \ldots, V_n\}$ on joukko havaittuja muuttujia, jotka määräytyvät mallin sisältämistä muuttujista, eli joukon $\mathbf{U} \cup \mathbf{V}$ alkioista +\item $\mathbf{F}=\{f_{V_1}, f_{V_2}, \ldots, f_{V_n}$ on sellainen joukko funktioita, että jokainen $f_{V_i}$ on kuvaus joukolta $\mathbf{U} \cup (\mathbf{V} \ V_i)$ joukolle $V_i$, ja joukko $\mathbf{F}$ muodostaa kuvauksen joukolta $\mathbf{U}$ joukkoon $\mathbf{V}$. +\end{enumerate} -\noindent Tällöin sanotaan, että $G$ on yksinkertainen suunnattu verkko. \end{maar} -\noindent Esimerkkinä käytetystä verkosta $H$ nähdään heti, että se on yksinkertainen suunnattu verkko, koska siinä ei ole yhtään silmukkaa. Yksinkertaisesta suunnatusta verkosta käytetään englanniksi nimitystä \emph{directed acyclic graph} ja se saatetaan lyhentää DAG. +Kontrafaktuaalit muodostuvat, kun kausaalimalliin tehdään muutos. -\begin{maar}[Polku ja suunnattu polku] \label{polku} +\begin{maar}[Kontrafaktuaali (pearl)] -Oletetaan, että $G$ on yksinkertainen verkko ja $n \in \N, n \geq 1$. +Oletetaan, että $M$ on kausaalimalli ja että $M_x$ on kausaalimalli, jossa muuttujasta $X$ riippuviin yhtälöihin on sijoitettu $X=x$. Merkitään muuttujan $Y$ ratkaisua mallissa $M_x$ merkinnällä $Y_{M_x}(u)$. Tällöin kontrafaktuaali $Y_x(u)$ (eli muuttujan $Y$ arvo tilanteessa $u$, jos $X$ olisi ollut $x$) on -\begin{enumerate}[(a)] -\item Verkon $G$ solmujen jono $v_1, \ldots, v_n$ on \emph{polku} solmusta $v_1$ solmuun $v_n$, jos jonon jokaisesta solmusta on kaari jonon seuraavaan solmuun. Polkua voidaan merkitä $v_1 \leadsto v_n$. -\item Jos verkko $G$ on suunnattu verkko, $a, b \in V$ ja kaikki polun $a \leadsto b$ kaaret kulkevat kaarien suuntien mukaisesti, voidaan täsmentää, että polku $a \leadsto b$ on \emph{suunnattu polku}. -\item Polku on \emph{yksinkertainen}, jos kukin solmu esiintyy polussa vain kerran, paitsi että viimeinen ja ensimmäinen saavat olla sama solmu. \cite{tira} -\item Yksinkertainen polku on \emph{sykli} eli \emph{kehä}, jos viimeinen ja ensimmäinen solmu ovat samat. \cite{tira} %Suuntaamattomassa verkossa lisäksi vaaditaan, että syklissä pitää olla vähintään kolme solmua. -\end{enumerate} +\begin{equation} +Y_x(u) \overset{\Delta}{=} Y_{M_x}(u). +\end{equation} \end{maar} -\smallskip +\section{Tutkimusongelma} -\noindent Huomataan, että verkossa $H$ on useita polkuja solmusta $R$ solmuun $Y$. Polku $R \rightarrow T \rightarrow Y$ on ainut suunnattu polku ja $R \leftarrow X \rightarrow Y$ on tavallinen polku, sillä solmujen $R$ ja $X$ välillä kuljetaan nuolen suunnan vastaisesti. Verkossa ei ole yhtään sykliä eli se on \emph{syklitön}. Suunnatuista ja syklittömistä verkoista voidaan käyttää englannin kielestä juontuvaa lyhennettä DAG \emph{(directed acyclic graph)} \cite{tira}. +Oletetaan, että on olemassa aineisto $D = \{x, j, t, y\}$, joka on valikoidusti luokiteltu, ja päätöksentekijä $J(r)$, missä $r$ kuvaa hänen hyväksymisprosenttia. Tavoitteena on arvioida päätöksentekijän $J(r)$ virheprosenttia mahdollisimman tarkasti millä tahansa hyväksymisprosentilla $r \in [0, 1]$. -\smallskip +\chapter{Aineisto}\label{aineisto} -\begin{maar}[Jälkeläisyys] \label{sukulaisuus} +Tutkimuksessa käytettiin synteettistä aineistoa, johon simuloitiin kolme muuttujaa $X$, $Z$, ja $W$. Näistä muuttujista $X$ on sekä mallin että päätöksentekijän havaittavissa. Käytännössä muuttuja $X$ kuvaa kirjallista informaatiota, joka on erilaisissa pöytäkirjoissa tai rekistereissä. Muuttujalla $Z$ kuvataan tietoa, jonka vain päätöksentekijä voi havaita: kuten Lakkaraju havainnollistaa, tällaista voi olla oikeuskäsittelyissä tieto siitä, onko vastaajalla perhettä mukana oikeussalissa. $W$ tuo malliin kohinaa. Muuttujalla esitämme aineistossa informaatiota, joka ei ole saatavilla päätöksentekijöille eikä mallille, mutta vaikuttaa silti tulokseen. Aineistossa nämä kaikki ovat riippumattomia standardinormaalijakautuneita satunnaismuuttujia. \cite{lakkaraju17} -Oletetaan, että $G=(V, E)$ on suunnattu verkko ja $a, b \in V$. \\ - -\noindent Jos on olemassa suunnattu polku $a \leadsto b$, niin solmun $b$ sanotaan olevan solmun $a$ \emph{jälkeläinen}. Vastaavasti tällöin sanotaan solmun $a$ olevan solmun $b$ \emph{vanhempi}. -\end{maar} +Tulosmuuttujan $Y$ arvo otettiin satunnaisesti Bernoulli-jakaumasta parametrilla $p = \pr(Y=0|X, Z, W)=\dfrac{1}{1+\text{exp}\{-(\beta_xx+\beta_zz+\beta_ww)\}}$. Lausekkeen kertoimet $\beta_x$, $\beta_z$ ja $\beta_w$ asetettiin arvoihin 1, 1 ja 0,2. \cite{lakkaraju17} -\noindent Esimerkiksi kuvan \ref{esverkko} verkossa solmulla $Y$ ei ole jälkeläisiä ja solmun $Z$ jälkeläiset ovat kaikki muut verkon solmut poislukien se itse, eli solmun $Z$ jälkeläiset on joukko $V \setminus \{Z\}$. +Päätösmuuttujan $T$ arvo määritettiin vertaamalla lausekkeen $\pr(T=0|X, Z)=\frac{1}{1+\text{exp}\{-(\beta_XX+\beta_ZZ)\}} + \epsilon$, missä $\epsilon \sim N(0; 0,1)$, arvoa vastaavan satunnaismuuttujan kvantiilifunktion $F^{-1}_{\pr(T=0|X, Z)}$ arvoon kohdassa $r$. Henkilölle annetaan kielteinen päätös $T=0$, jos $F^{-1}_{\pr(T=0|X, Z)}(r) < \pr(T=0|X=x_i, Z=z_i)$ ja positiivinen päinvastaisessa tapauksessa. Näin annetut päätökset ovat toisistaan riippumattomia ja tuomarille annettu hyväksymisprosentti konvergoi havaittuun hyväksymisprosenttiin. -Kausaalipäättelyssä kausaalisten vaikutusten identifiomiseksi tarvitaan usein selvittää niin sanotut \emph{haarukka-} ja \emph{käänteiset haarukkasolmut}. Määritellään ne seuraavaksi. -\begin{maar}[Haarukkasolmu] \label{haarukka} +Kun aineisto oli simuloitu, se jaettiin koulutus- ja testiaineistoihin. Lopuksi molempia aineistoja muokattiin siten, että tulosmuuttujan arvo oli saatavissa vain yksilöille, joille oli annettu positiivinen päätös $(T=1)$. Kielteisen päätöksen saaneille tulosmuuttujan arvo asetettiin arvoon $0$. \cite{lakkaraju17} -Oletetaan, että suunnatussa verkossa on polku $A \leftarrow B \rightarrow C \leftarrow D$. Tällöin solmua B sanotaan \emph{haarukkasolmuksi} ja solmua C \emph{käänteiseksi haarukkasolmuksi}. - -\end{maar} +%%%%%%%%% +%%%%%%%%% %%%%%%%%% -\section{Kausaalipäättely}\label{kausaali} - -Judea Pearl esittää artikkelissaan \cite{pearl10}, että kaikessa tutkimuksessa, joka hyödyntää kausaalipäättelyä, tulisi edetä järjestelmällisesti neljässä vaiheessa: - -\begin{enumerate} +\chapter{Menetelmät}\label{metodit} -\item Määrittely: Määritetään tavoitesuuruus Q funktiona Q($\M$), joka voidaan laskea kaikille malleille $\M$. -\item Oletuksien esitys: Esitä kausaaliset oletukset luonnollisella kielellä ja ilmaise niiden rakenteellinen osa verkkona. -\item Identifioituvuus: Osoita, onko tavoitesuuruus määritettävissä (ilmaistavissa estimoitavina parametreina). -\item Estimointi: Estimoi tavoitesuuruutta, jos se on identifioituva tai approksimoi sitä jos se ei ole. Tarkista mallin mahdolliset (tilastolliset) oletukset ja implikaatiot ja muuta mallia, jos oletukset osoittautuvat paikkaansa pitämättömiksi. +Ennustemallien suorituskyvyn arvioiminen valikoidusti luokitellussa aineistossa ei ole suoraviivaista. Yksinkertaisimmillaan ongelma juontuu siitä, että niiden havaintojen $X$ jakauma, joille on annettu myönteinen päätös, on erilainen kuin kielteisen päätösten saaneiden havaintojen jakauma, eli +\begin{equation} +f_X(X|T=0) \neq f_X(X|T=1). +\end{equation} +Kuten mainittua, lisäongelmana valikoidusti luokitelluissa aineistoissa on se, että kielteisen päätöksen saaneille vasteen arvo ei ole havaittu ja siten vasteen puuttuminen lliittyy vasteen arvoon. -\end{enumerate} +Valikoidusti luokitelluissa aineistoissa mallin tarkkuutta voidaan verrata kahteen metriikkaan, mallin todelliseen tarkkuuteen (engl. \emph{true evaluation}) ja havaittujen tulosten perusteella laskettuun tarkkuuteen. Todellinen tarkkuus arvioidaan järjestämällä havainnot jonkin ennustemallin $\B$ ennusteiden mukaan. Malli $\B$ voi olla esimerkiksi regressiomalli tai neuroverkko, joka yhdistää yksilön havaittavissa olevat ominaisuudet $\mathbf{x}$ todennäköisyyteen negatiiviseen tulokseen $Y=0$. Jos mallin suorituskykyä arvioidaan hyväksymistasolla $r'$ ja havaintoja on $N$ kappaletta, mallin virheprosentti arvioidaan laskemalla $\sum_{i=1}^{r'\cdot N} \mathbbm{1}\{y_i=0\}$ niiden havaintojen joukossa, joille $\B$ on arvioinut pienimmän epäonnistumisen todennäköisyyden (katso algoritmi \ref{alg:true_eval}). -\noindent Tutkielmani tavoitteena on esittää algoritmi, jolla voimme paremmin ennustaa riskiä populaatiotasolla, kun muutamme myönteisten päätösten osuutta jakun käytössä on valintaharhasta kärsivää aineistoa. Todennäköisyyslausekkein ilmaistuna haluamme siis selvittää vapautusprosentin muutoksen vaikutusta epätoivottavan tapahtuman $Y=0$ todennäköisyyteen, mikä voidaan kirjoittaa muotoon +Koska oikeissa sovelluksissa sellaisia tuloksia $Y$ ei voida havaita, joille päätös on ollut kielteinen ($T=0$), niin yleensä mallin suorituskyvyn arvioinneissa käytetään vain havaittuja tuloksia. Pelkästään havaittujen tulosten perusteella laskettu virheprosentti on usein virheellinen, koska -\begin{equation} \label{q_m} -\pr(Y=0 | \text{do}(R=r)). -\end{equation} +XXXXXX (mallilla ei ole saatavissa muuttujaa Z ja se sitten järjestää eri järjestykseen lisäksi sellainen "harjakuva"). Havaittujen tuloksien perusteella laskettu virheprosentti lasketaan algoritmin \ref{alg:labeled_outcomes} esittämällä tavalla -\noindent Huomataan, että lauseke \ref{q_m} ei riipu mistään mallista $\M$, joten se täyttää Pearlin tavoitesuuruuden Q määritelmän mukaiset ehdot. +\begin{algorithm}[] % enter the algorithm environment +\caption{Todellinen tarkkuus} % give the algorithm a caption +\label{alg:true_eval} % and a label for \ref{} commands later in the document +\begin{algorithmic}[1] % enter the algorithmic environment +\REQUIRE Aineisto $\D$, jossa on mallin $\B$ ennusteet $\s$ ja \emph{kaikki tulokset}, hyväksymisprosentti r +\ENSURE Virheprosentti hyväksymisprosentilla $r$ +\STATE Järjestä aineisto ennusteiden $\s$ mukaan nousevaan järjestykseen. +\STATE \hskip3.0em $\rhd$ Vaarallisimmat yksilöt ovat nyt taulukon viimeisenä. +\STATE Laske vapautettavien määrä $N_{vap} = |\D| \cdot r$. +\RETURN $\frac{1}{|\D|}\sum_{i=1}^{N_{vap}}\mathbbm{1}\{y_i=0\}$ +\end{algorithmic} +\end{algorithm} -Kausaalipäättelyssä mallit määritellään usein yksinkertaisina suunnattuina verkkoina. Mallin määrittämästä verkosta voidaan suoraan lukea kausaaliset riippuvuussuhteet ja malliin kuuluvat muuttujat. Jos mallissa on solmut $A$ ja $B$ ja jos solmu $B$ on solmun $A$ jälkeläinen, niin muuttujalla $A$ on mallin mukaan jonkinlainen kausaalinen vaikutus muuttujaan $B$. Jos verkossa muuttujien välillä ei ole jälkeläisyyssuhdetta, niin ne ovat toisistaan riipumattomat. Kausaalisen vaikutuksen funktionaalista muotoa ei usein määritellä. +\begin{algorithm}[] % enter the algorithm environment +\caption{Havaittujen tulosten perusteella laskettu tarkkuus} % give the algorithm a caption +\label{alg:labeled_outcomes} % and a label for \ref{} commands later in the document +\begin{algorithmic}[1] % enter the algorithmic environment +\REQUIRE Aineisto $\D$, jossa on mallin $\B$ ennusteet $\s$ ja \emph{puuttuvia tuloksia}, hyväksymisprosentti r +\ENSURE Virheprosentti hyväksymisprosentilla $r$ +\STATE Poista puuttuvat havainnot ja tallenna loput havainnot aineistoon $\D_{hav}$. +\STATE Järjestä $\D_{hav}$ ennusteiden $\s$ mukaan nousevaan järjestykseen. +\STATE \hskip3.0em $\rhd$ Vaarallisimmat yksilöt ovat nyt taulukon viimeisenä. +\STATE Laske vapautettavien määrä $N_{vap} = |\D_{hav}| \cdot r$. +\RETURN $\frac{1}{|\D_{hav}|}\sum_{i=1}^{N_{vap}}\mathbbm{1}\{y_i=0\}$ +\end{algorithmic} +\end{algorithm} -\subsection{Merkinnät ja keskeiset lauseet}\label{kausaalimerk_laus} -Kausaalipäättelyssä käytettävät merkinnät noudattelevat pitkälle tavallisia todennäköisyyslaskennan merkintöjä. Kun selvitetään muuttujan $X$ vaikutusta muuttujaan $Y$ ja tehdään interventio asettamalla muuttuja $X$ arvoon $x_0$, sitä merkitään $\pr(Y| \text{do} (X=x_0))$. +% Nimet kuviin: TODELLINEN SUORITUSKYKY > lyh. TODELLINEN, HAVAITUT TULOKSET > HAVAITUT, SUPISTUSALGORITMI, KONTRAFAKTUAALIT -Käydään seuraavaksi läpi kausaalilaskennan kannalta keskeisimmät lauseet. Lauseiden todistukset sivuutetaan, mutta ne on löydettävissä Pearlin artikkelin lähteistä \cite{pearl10}. Määritelmät \ref{d_sep} ja \ref{takaovi} \textbf{JNE}. +\section{Supistusalgoritmi}\label{contraction} -\begin{maar}[d-separoituvuus \cite{pearl10}]\label{d_sep} +Supistusalgoritmi (\emph{contraction}) on 2017 esitetty algoritmi, jonka avulla voidaan arvioida ennustavien mallien todellista suorituskykyä valikoidusti luokitelluissa aineistoissa. \cite{lakkaraju17} Algoritmin toimintaperiaatteena on arvioida mielivaltaisen ennustavan mallin $\B$ ennusteita löyhimmän, eli eniten positiivisia päätöksiä päätöksentekijän tekemien päätösten joukossa. Algoritmin pseudokoodi on esitetty algoritmissa \ref{contraction_alg}. Algoritmin toiminta perustuu armollisimman päättäjän arvioiman havaintojoukon järjestämiseen ja osittamiseen siten, että mallin $\B$ ennusteen virheprosenttia arvioidaan vain havainnoilla, joille on havaittu tulos. -Joukko $\s$ katkaisee (blocks) polun $p$, jos vähintään toinen seuraavista ehdoista on voimassa: +Supistusalgoritmin oletukset on esitetty alkuperäisissä tuloksissa. \cite{lakkaraju17} Algoritmi olettaa, että havaintojen määräytyminen päätöksentekijöille on täysin satunnaista ja että aineistossa on useita päätöksentekijöitä eri hyväksymisprosenteilla. Oletuksista ensimmäinen on looginen ja yleisesti, joskin saattaa rajoittaa joidenkin aineistojen käyttöä jos päätöksentekijän osoittaminen on jonkinlaisen (oikeus)prosessin tulos. Useiden päätöksentekijöiden oletuksessa on samankaltaiset ongelmat: kaikissa osissa aineistoa ei ole välttämättä saatavissa päätöksentekijän identifioivaa tietoa, jolloin erilaisten aineistojen käyttö rajoittuu. (Onko balanssin kanssa ongelmaa: jos jokin päättäjä 80 \% AR tekee 80\% päätöksistä ja joku jolla on 50 \% AR tekee loput?) -\begin{enumerate}[(a)] -\item Polku $p$ sisältää vähintään yhden solmun, joka on jonkin polun kulkusuuntaisen kaaren lähtösolmu ja kuuluu joukkoon $\s$. (arrow-emitting) -\item Polku $p$ sisältää vähintään yhden käänteisen haarukkasolmun (collision node), joka ei kuulu joukkoon $\s$ ja jolla ei ole jälkeläisiä joukossa $\s$. -\end{enumerate} +Supistusalgoritmin tarkkuuteen vaikuttavat armeliaimman päätöksentekijän hyväksymisprosentti, hänen antamien päätöksien yhdenmukaisuus ennustemallin $\B$ ennusteiden kanssa (engl. \emph{agreement rate}) ja hänen antamien päätöksien lukumäärä. Näiden suureiden vaikutusta on analysoitu alkuperäisessä julkaisussa. \cite{lakkaraju17} Yleisesti hyväksymisprosentin, yhdenmukaisuuden ja päätöksien lukumäärän kasvaessa algoritmin tarkkuus paranee. -\noindent Jos joukko $\s$ katkaisee kaikki polut muuttujasta $X$ muuttujaan $Y$, sanotaan joukon $\s$ d-separoivan muuttujat $X$ ja $Y$. Tällöin $X$ ja $Y$ ovat riippumattomia ehdolla $\s$, eli $X \independent Y | \s$. +\begin{algorithm} % enter the algorithm environment +\caption{Supistusalgoritmi} % give the algorithm a caption +\label{contraction_alg} % and a label for \ref{} commands later in the document +\begin{algorithmic}[1] % enter the algorithmic environment +\REQUIRE Aineisto $\D$, todennäköisyydet $\s$ ja hyväksymisprosentti $r$ +\ENSURE Virheprosentti hyväksymisprosentilla $r$ -\end{maar} +\STATE Olkoon $q$ päättäjä, jolla on korkein hyväksymisprosentti $r$. +\STATE $\D_q = \{(x, j, t, y) \in \D | j = q \}$ +\STATE \hskip3.0em $\rhd$ Nyt $\D_q$ on havaintojoukko, jolle $q$ on antanut päätökset. +\STATE +\STATE $\RR_q = \{(x, j, t, y) \in \D_q | t=1 \}$ +\STATE \hskip3.0em $\rhd$ $\RR_q$ on on joukon $\D_q$ osa, jolle tulosmuuttujan arvot on havaittu. +\STATE +\STATE Järjestä taulukoon $\RR_q$ havainnot laskevaan järjestykseen todennäköisyyksien $\s$ mukaan ja talleta ne taulukkoon $\RR_q^{sort}$ +\STATE \hskip3.0em $\rhd$ Mallin korkeariskisimmät ovat nyt listan kärjessä +\STATE +\STATE Ota taulukosta $\RR_q^{sort}$ sen $[(1.0-r)|\D_q|]-[|\D_q|-|\RR_q|]$ ensimmäistä/ylintä havaintoa ja talleta ne taulukkoon $\RR_\B$. +\STATE \hskip3.0em $\rhd$ $\RR_\B$ on lista henkilöistä, joille malli $\B$ on antanut positiivisen päätöksen +\STATE +\STATE Laske $\mathbf{u} = \sum_{i=1}^{|\RR_\B|} \dfrac{\delta\{y_i=0\}}{|\D_q|}$. -\begin{maar}[Takaovikriteeri (\emph{back-door criterion}) \cite{pearl10}] \label{takaovi} +\RETURN $\mathbf{u}$ +\end{algorithmic} +\end{algorithm} -Oletetaan, että halutaan selvittää muuttujan X kausaalista vaikutusta muuttujaan Y. Joukko $\s$ on \emph{riittävä} vaikutuksen selvittämiseen (sufficient for adjustment), kun seuraavat ehdot ovat voimassa: +%%%%%%%%% -\begin{enumerate}[(1)] -\item Yksikään joukon $\s$ alkioista ei ole solmun X jälkeläinen. -\item Joukon $\s$ alkiot katkaisevat kaikki määritelmän \ref{d_sep} mukaiset kiertoreitit solmusta X solmuun Y. Kiertoreittejä ovat polut, jotka päättyvät muuttujaan $X$ osoittavaan nuoleen. -\end{enumerate} +\section{Kontrafaktuaalinen imputointi}\label{kf_imputointi} -\end{maar} +Kontrafaktuaalinen imputointimetodi perustuu kausaalimalliin, joka on esitetty kuvassa \ref{kausaalimalli}. Metodi perustuu siihen, että latentista muuttujasta $Z$ on aina saatavissa jonkin verran tietoa. Esimerkiksi oikeuskäsittelyissä, jos havaittu muuttuja $X$ osoittaa epäillyn olevan vaarallinen, mutta on päätetty vapauttaa epäilty $T=1$, niin voidaan ajatella latentin informaation -- eli muuttujan $Z$ arvon -- olleen niin poikkeava, että vapautus kannatti tehdä. Sama pätee päinvastaisessa tapauksessa. Toisaalta tilanteissa, joissa päätös $T$ ja muuttujan $X$ arvot ovat samansuuntaiset, latentista muuttujasta ei ole niin paljoa informaatiota saatavilla. Voidaan vain todeta, että sen arvo ei ole ollut riittävän äärimmäinen muuttamaan päätöstä. +Tutkielmassa esitetyt tulokset ja päätelmät on tehty kaksiarvoisille muuttujille, mutta ne pätevät myös jatkuville muuttujille. Tällöin mallin logistinen regressio voidaan vaihtaa esimerkiksi lineaariseen malliin ja tarkkuutta voidaan mitata keskimääräisen virheen sijaan residuaalien neliösummalla. -\subsection{Malli}\label{kausaalimalli} +Tässä esitetty menetelmä perustuu jossain määrin siihen, että päätöksentekijällä on tulokseen liittyvää tietoa ja että hän käyttää sitä hyväkseen. Huomattavaa on, että jos päätöksentekijä sivuuttaa hänelle esitetyn tiedon ja tekee päätökset täysin satunnaisesti, aineisto ei ole enää valikoidusti luokiteltua ja havaintoja puuttuu täysin satunnaisesti. Tällöin regressiomallit voidaan rakentaa täysin normaalisti ja puuttuvat havainnot voidaan esimerkiksi poistaa. -Malli sisältää viisi muuttujaa, jotka on esitelty lyhyesti taulukossa \ref{syntmjat}. Muuttujalla $R$ kuvataan päätöksentekijän hyväksymisprosenttia, eli sitä prosentuaalista osuutta henkilöistä, joilla on pienin vaara epätoivottavaan tulokseen ja joille siten voidaan antaa myönteinen päätös. $X$ ilmentää henkilön henkilökohtaisia ominaisuuksia, jotka ovat sekä päätöksentekijän että mallin havaittavissa. Muuttuja $X$ voi olla esimerkiksi jonkinlainen rekisteritieto, kuten ikä tai sukupuoli. Muuttuja $Z$ on muuttuja, jonka tuomari tai muu asiantuntija voi havaita, mutta joka on mallilta piilotettu. Muuttujan $Z$ voidaan ajatella esimerkiksi oikeuskäsittelyjen tapauksessa kuvaavan epäillyn kääytöstä oikeussalissa. Tulosmuuttuja $Y$ ja päätösmuuttuja $T$ ovat kaksiarvoisia ja niiden määrittelyt on esitelty kuvassa \ref{valikoitumisharha}: myönteistä päätöstä merkitään $t=1$, kielteistä $t=0$. Vastaavasti myönteinen tulos määritellään muuttujan $y$ arvoksi 1, kielteinen arvoksi 0. +\subsection{Kausaalimalli} -Mallin määrittelevä graafi on estetty kuviossa \ref{final_model} ilman virhemuuttujia. Graafista voidaan suoraan lukea oletukset: oletetaan, että $Z \independent X, R$ mutta laajennetaan Lakkarajun oletuksia sallimalla muuttujan X vaikutus muuttujaan R \cite{lakkaraju17}. Mallin oletetuilla kausaalisilla vaikutuksilla on lisäksi selkeästi ilmaistavat realisaatiot: kuinka osuuden $R$ muuttaminen vaikuttaa päätökseen ja edelleen päätös tulokseen ja niin edelleen. +Kuvassa \ref{kausaalimalli} oleva verkko esittää oletetun kausaalisuuden rakenteen muuttujien välillä. Kuva esittää kuinka päätöksentekijän hyväksymisprosentti $R \in [0, 1]$ vaikuttaa vain päätökseen $T$. Päätökseen vaikuttaa lisäksi latentti informaatio $Z$ ja kirjallinen, malleille havaittavissa oleva informaatio $X$. Kuvasta voidaan lisäksi lukea, kuinka edellä mainitut muuttujat $T$, $X$ ja $Z$ vaikuttavat tulokseen $Y$. Erityispiirteenä on huomattava se, että jos päätös $T$ on kielteinen ($T=0$) niin tulosmuuttujan arvoa ei voida havaita. -\begin{table} %[H] +\begin{figure} \centering -\begin{tabular}{rl} -\hline \hline -Muuttuja & Kuvaus \\ -\hline - R & Myönteisten päätösten osuus prosentteina $r \in [0, 1]$ \\ - X & Kirjatut muuttujat, havaittavissa kaikille \\ - Z & Kirjaamattomat muuttujat, vain päättäjän havaitsemat\\ - Y & Tulosmuuttuja, $y \in \{0, 1\}$\\ - T & Päätösmuuttuja, $t \in \{0, 1\}$\\ -\hline \hline -\end{tabular} -\caption{Mallin muuttujien selitteet} -\label{syntmjat} -\end{table} - -\begin{figure}% [H] - \centering - \begin{subfigure}[b]{0.4\textwidth} - \includegraphics[width=\textwidth]{final_model} - \caption{Malli ilman interventiota.} - \label{final_model} - \end{subfigure} - ~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. - %(or a blank line to force the subfigure onto a new line) - \begin{subfigure}[b]{0.5\textwidth} - \includegraphics[width=\textwidth]{intervention_model} - \caption{Malli, johon interventio on merkitty.} - \label{intervention_model} - \end{subfigure} - ~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. - %(or a blank line to force the subfigure onto a new line) - \caption{Kausaalimallit graafeina.}\label{mallikuvat} +\begin{tikzpicture}[->,>=stealth',node distance=2cm, semithick] + +\tikzstyle{every state}=[fill=none,draw=black,text=black] + +\node[state] (R) {$R$}; +\node[state] (X) [right of=R] {$X$}; +\node[state] (T) [below of=X] {$T$}; +\node[state] (Z) [rectangle, right of=X] {$Z$}; +\node[state] (Y) [below of=Z] {$Y$}; + +\path (R) edge (T) +(X) edge (T) +edge (Y) +(Z) edge (T) +edge (Y) +(T) edge (Y); +\end{tikzpicture} +\caption{Kausaalimalli: $R$ on päätöksentekijän hyväksymisprosentti, $X$ kirjatut, kaikille havaittavissa olevat muuttujat, $T$ päätöksentekijän päätös, $Z$ kirjaamattomat, vain hänelle havaittavissa olevat muuttujat ja $Y$ tulosmuuttuja. Virhetermit on jätetty pois selkeyden vuoksi.} \label{kausaalimalli} \end{figure} -Johdetaan muuttujan $R$ kausaalivaikutus muuttujaan $Y$ yli kaikkien ositteiden X. Huomataan, että osuuden $R$ kausaalinen vaikutus voidaan ilmaista suoraan lausekkeella \ref{q_m}, sillä $\pr(Y=0|\text{do}(R=0))=0$ ja siten edelleen -\begin{equation*} - \pr(Y=0|\text{do}(R=r))-\pr(Y=0|\text{do}(R=0)) \\ -% =\: \pr(Y=0|\text{do}(R=r))-0 \\ - =\: \pr(Y=0|\text{do}(R=r)). -\end{equation*} - -Osoitetaan seuraavaksi, että X on riittävä vaikutusten korjaamiseen määritelmän \ref{takaovi} mukaisesti, kun selvitetään muuttujan R kausaalista vaikutusta muuttujaan Y. Mallista voidaan suoraan lukea, että takaovikriteerin ensimmäinen ehto on voimassa: X ei ole muuttujan R jälkeläinen. Polut, jotka muuttujan X pitää katkaista ollakseen riittävä vaikutusten korjaamiseen ovat $R \leftarrow X \rightarrow Y$, $R \leftarrow X \rightarrow T \rightarrow Y$ ja $R \leftarrow X \rightarrow T \leftarrow Z \rightarrow Y$. Muuttuja X täyttää kuitenkin määritelmän \ref{d_sep} (a)-kohdan ehdon ja siten d-separoi muuttujat R ja Y. Tällöin X on riittävä vaikutusten korjaamiseen ja voidaan hyödyntää Pearlin kaavaa 25 \cite{pearl10}: - -\begin{subequations} \label{derivation} -\begin{align} - \pr&(Y=0|\text{do}(R=r)) = \sum_x \pr(Y=0| R=r, X=x) \pr(X=x) \label{derivation1} \\ - &= \sum_x \left( \sum_t \pr(Y=0, T=t| R=r, X=x) \right) \pr(X=x) \label{derivation2} \\ - &= \sum_x \left( \sum_t \pr(Y=0| T=t, R=r, X=x)\pr(T=t| R=r, X=x) \right) \pr(X=x) \label{derivation3} \\ - &= \sum_x \pr(Y=0| T=1, R=r, X=x) \pr(T=1| R=r, X=x) \pr(X=x) \label{derivation4} \\ - &= \sum_x \pr(Y=0| T=1, X=x) \pr(T=1| R=r, X=x) \pr(X=x) \label{derivation5} -\end{align} -\end{subequations} - -Yllä oleva lauseke on yhtäpitävä myös jatkuville muuttujan $x$ arvoille, kun korvaamme summaukset integraalilla parametriavaruuden yli: $$\pr(Y=0|\text{do}(R=r)) = \int_x \pr(Y=0| T=1, X=x) \pr(T=1| R=r, X=x) \pr(X=x).$$ +\subsection{Bayes-malli} -\subsection{algo} +Esittämämme menetelmä perustuu bayesiläisen mallin hyödyntämiseen. Bayes-mallin määrittämiseksi on asetettava priorit kertoimille ja muuttujalle $Z$. Koska muuttuja $Z$ esittää useiden muuttujien summaa (vaatetus, käytös ja niin edelleen) voidaan \emph{a priori} olettaa muuttujan $Z$ olevan standardinormaalijakautunut keskeisen raja-arvolauseen nojalla. Logistisen regression kertoimien ($\beta_{xt},~\beta_{xy},~\beta_{zt}$ ja $\beta_{zy}$) priori on Studentin t-jakauma viidellä vapausasteella. Laskennallisista syistä priorit uudelleenparametroitiin olemaan epäkeskisiä. Prioriin päädyttiin MCMC-sämplerin diagnostiikoiden jälkeen ja koska normaalipriorilla on liian kevyet/raskaat hännät Gelman et al. mukaan. Mallinsimme aineistoa seuraavalla hierarkkisella mallilla \ref{eq:data_model} käyttäen Stan-ohjelmistoa \cite{stan} +% osoita tässä uudelleenparametroinnin / epäkeskisen parametroinnin yhtäpitävyys? +% + huomioita "funneliin" liittyvistä ongelmista -Pearlin mukaan: +\begin{align} \label{eq:data_model} +Y ~|~ T = 1,~ x & \sim \text{Bernoulli}(\invlogit(\alpha_y + \beta_{xy} x + \beta_{zy} z)) \\ \nonumber +T ~|~ \D,~x,~Z & \sim \text{Bernoulli}(\invlogit(\alpha_{j} + \beta_{xt} x + \beta_{zt}z)). \\ \nonumber +Z & \sim N(0, 1) \\ \nonumber +\alpha_*~|~\sigma_\alpha & \sim N(0, \sigma^2_\alpha) \\ \nonumber % TARKISTA +\beta_* & \sim t_6 \\ \nonumber % TARKISTA +\sigma_\alpha & \sim N_+(0, \sigma_\tau), +\end{align} -$$P(Y=0|do(R=r), X=x)=P(Y=0|R=r, X=x)=P(Y=0|R=r, X=x, T=1)P(T=1|R=r, X=x)$$ +missä $j = 1, \ldots, M$ ja $M$ on tuomarien lukumäärä. Käytännössä tehtiin kaksi logistista regressiomallia, joista ensimmäinen mallintaa päätöksiä havaittujen ominaisuuksien $X$ ja tuomarin identiteetin perusteella hyödyntäen koko aineistoa. Jokaiselle tuomarille määritetään erillinen leikkauspiste $\alpha_j$, jotta erilaiset hyväksymisprosentit voidaan ottaa huomioon. Toinen regressiomalleista mallintaa tuloksia $Y$ havaittujen ominaisuuksien $X$ avulla käyttäen vain sitä osaa aineistosta, jolle tulokset on havaittu, eli jolle $T=1$. -Mallit vaikutukset laskettiin Pythonilla versio 3.6. Syötteett sklinear mallliin , joka fitattiin testi dataan ja sitten integroitiin eri leniencyn tasoilla muuttujan X parametriavaruuden eli reaaliakselin ylitse. +Käyttäen posteriorista poimittuja havaintoja voimme ennustaa kontrafaktuaalien arvon prediktiivisestä jakaumasta (\emph{posterior predictive}) +\begin{equation} \label{eq:post_pred} +p(\tilde{y}|\mathbf{y})=\int_\Omega p(\tilde{y}|\theta)p(\theta|\mathbf{y})d\theta. +\end{equation} +Käytännössä, kun Stanilla on arvioitu parametrien $\theta$ arvot jne jne... + +\begin{algorithm}[H] % enter the algorithm environment +\caption{Kontrafaktuaalinen imputointialgoritmi} % give the algorithm a caption +\label{counterfactual_imputation} % and a label for \ref{} commands later in the document +\begin{algorithmic}[1] % enter the algorithmic environment +\REQUIRE Aineisto $\D = \{x, j, t, y\}$, ja hyväksymisprosentti $r$ +\ENSURE Virheprosentti (FR) hyväksymisprosenttiella $r$ + +\STATE Poimi $\s$ havaintoa jokaisen parametrin posteriorista. +\FOR{$i$ in $1, \ldots, \s$} +\FOR{$j$ in $1, \ldots, n$} +\STATE Poimi uusi tulos $\hat{Y}$ Bernoulli-jakaumasta parametrilla $\invlogit(\alpha_j[i]+\beta_{xt}[i]x+\beta_{zt}z[i,j]$. +\ENDFOR +\STATE Imputoi puuttuvat arvot käyttäen äsken vedettyjä arvoja. +\STATE Järjestä havainnot nousevaan järjestykseen ennustemallin $\B$ ennusteiden perusteella. +\STATE Laske $\text{FR} = \frac{1}{n}\sum_{k=1}^{n\cdot r} \mathbbm{1}\{y_k=0\}$. +\ENDFOR + +\RETURN $\mathcal{U}$ +\end{algorithmic} +\end{algorithm} -%\begin{algorithm} % enter the algorithm environment -%\caption{Kausaalialgoritmi} % give the algorithm a caption -%\label{causal_alg} % and a label for \ref{} commands later in the document -%\begin{algorithmic}[1] % enter the algorithmic environment -%\REQUIRE aineisto $(\mathbf{x}, t, y) \in \D_t, \D_v$ ja hyväksymisaste $r \in [0, 1]$, missä $\D_t$ on testiaineisto ja $\D_v$ validointiaineisto. -%\ENSURE $\pr(Y=0|\text{do}(R=r))$ +%\section{Kausaalipäättely}\label{kausaali} +% +%Judea Pearl esittää artikkelissaan \cite{pearl10}, että kaikessa tutkimuksessa, joka hyödyntää kausaalipäättelyä, tulisi edetä järjestelmällisesti neljässä vaiheessa: +% +%\begin{enumerate} +% +%\item Määrittely: Määritetään tavoitesuuruus Q funktiona Q($\M$), joka voidaan laskea kaikille malleille $\M$. +%\item Oletuksien esitys: Esitä kausaaliset oletukset luonnollisella kielellä ja ilmaise niiden rakenteellinen osa verkkona. +%\item Identifioituvuus: Osoita, onko tavoitesuuruus määritettävissä (ilmaistavissa estimoitavina parametreina). +%\item Estimointi: Estimoi tavoitesuuruutta, jos se on identifioituva tai approksimoi sitä jos se ei ole. Tarkista mallin mahdolliset (tilastolliset) oletukset ja implikaatiot ja muuta mallia, jos oletukset osoittautuvat paikkaansa pitämättömiksi. +% +%\end{enumerate} +% +%\noindent Tutkielmani tavoitteena on esittää algoritmi, jolla voimme paremmin ennustaa riskiä populaatiotasolla, kun muutamme myönteisten päätösten osuutta ja kun käytössä on valintaharhasta kärsivää aineistoa. Todennäköisyyslausekkein ilmaistuna haluamme siis selvittää vapautusprosentin muutoksen vaikutusta epätoivottavan tapahtuman $Y=0$ todennäköisyyteen, mikä voidaan kirjoittaa muotoon +% +%\begin{equation} \label{q_m} +%\pr(Y=0 | \text{do}(R=r)). +%\end{equation} +% +%\noindent Huomataan, että lauseke \ref{q_m} ei riipu mistään mallista $\M$, joten se täyttää Pearlin tavoitesuuruuden Q määritelmän mukaiset ehdot. +% +%Kausaalipäättelyssä mallit määritellään usein yksinkertaisina suunnattuina verkkoina. Mallin määrittämästä verkosta voidaan suoraan lukea kausaaliset riippuvuussuhteet ja malliin kuuluvat muuttujat. Jos mallissa on solmut $A$ ja $B$ ja jos solmu $B$ on solmun $A$ jälkeläinen, niin muuttujalla $A$ on mallin mukaan jonkinlainen kausaalinen vaikutus muuttujaan $B$. Jos verkossa muuttujien välillä ei ole jälkeläisyyssuhdetta, niin ne ovat toisistaan riipumattomat. Kausaalisen vaikutuksen funktionaalista muotoa ei usein määritellä. +% +%\subsection{Merkinnät ja keskeiset lauseet}\label{kausaalimerk_laus} +% +%Kausaalipäättelyssä käytettävät merkinnät noudattelevat pitkälle tavallisia todennäköisyyslaskennan merkintöjä. Kun selvitetään muuttujan $X$ vaikutusta muuttujaan $Y$ ja tehdään interventio asettamalla muuttuja $X$ arvoon $x_0$, sitä merkitään $\pr(Y| \text{do} (X=x_0))$. +% +%Käydään seuraavaksi läpi kausaalilaskennan kannalta keskeisimmät lauseet. Lauseiden todistukset sivuutetaan, mutta ne on löydettävissä Pearlin artikkelin lähteistä \cite{pearl10}. Määritelmät \ref{d_sep} ja \ref{takaovi} \textbf{JNE}. +% +%\begin{maar}[d-separoituvuus \cite{pearl10}]\label{d_sep} +% +%Joukko $\s$ katkaisee (blocks) polun $p$, jos vähintään toinen seuraavista ehdoista on voimassa: % -%\STATE Määritä $f(x) = \pr(X=x)$ testiaineistosta. -%\STATE Ennusta vastetta $Y$ selittävillä muuttujilla $X$ käyttäen harjoitusaineiston havaintoja, joilla $T=1$. -%\STATE Määritä harjoitusaineiston jokaiselle havainnolle $P(Y=0|X=x)$ käyttäen yllä olevaa mallia. -%\STATE Järjestä havainnot nousevaan järjestykeen edellisen kohdan todennäköisyyksien mukaan. -%\STATE Alusta muuttuja \texttt{summa} = 0. -%\FORALL{Jokaiselle parametriavaruuden pisteelle} -% \STATE $p_x \leftarrow P(X=x)$ -% \STATE $\mathcal{D_x} \leftarrow \{\mathcal{D} | X = x\}$ -% \STATE Assign first $r\cdot 100\%$ observations from $\mathcal{D_x}$ to $\mathcal{D}_{rx}$ -% \STATE $p_t \leftarrow \dfrac{|\{\mathcal{D}_{rx}|T=1\}|}{|\mathcal{D}_{rx}|}$ -% \STATE $\mathcal{D}_{tx} \leftarrow \{\mathcal{D}_x | T = 1\}$ -% \STATE $p_y \leftarrow \dfrac{|\{\mathcal{D}_{tx}|Y=0\}|}{|\mathcal{D}_{tx}|}$ -% \STATE Lisää muuttujaan \texttt{summa} tulo $p_y \cdot p_t \cdot p_x$ -%\ENDFOR -%\RETURN \texttt{summa} -%\end{algorithmic} -%\end{algorithm} +%\begin{enumerate}[(a)] +%\item Polku $p$ sisältää vähintään yhden solmun, joka on jonkin polun kulkusuuntaisen kaaren lähtösolmu ja kuuluu joukkoon $\s$. (arrow-emitting) +%\item Polku $p$ sisältää vähintään yhden käänteisen haarukkasolmun (collision node), joka ei kuulu joukkoon $\s$ ja jolla ei ole jälkeläisiä joukossa $\s$. +%\end{enumerate} +% +%\noindent Jos joukko $\s$ katkaisee kaikki polut muuttujasta $X$ muuttujaan $Y$, sanotaan joukon $\s$ d-separoivan muuttujat $X$ ja $Y$. Tällöin $X$ ja $Y$ ovat riippumattomia ehdolla $\s$, eli $X \independent Y | \s$. +% +%\end{maar} +% +%\begin{maar}[Takaovikriteeri (\emph{back-door criterion}) \cite{pearl10}] \label{takaovi} +% +%Oletetaan, että halutaan selvittää muuttujan X kausaalista vaikutusta muuttujaan Y. Joukko $\s$ on \emph{riittävä} vaikutuksen selvittämiseen (sufficient for adjustment), kun seuraavat ehdot ovat voimassa: +% +%\begin{enumerate}[(1)] +%\item Yksikään joukon $\s$ alkioista ei ole solmun X jälkeläinen. +%\item Joukon $\s$ alkiot katkaisevat kaikki määritelmän \ref{d_sep} mukaiset kiertoreitit solmusta X solmuun Y. Kiertoreittejä ovat polut, jotka päättyvät muuttujaan $X$ osoittavaan nuoleen. +%\end{enumerate} +% +%\end{maar} +% +% +%\subsection{Malli}\label{kausaalimalli} +% +%Malli sisältää viisi muuttujaa, jotka on esitelty lyhyesti taulukossa \ref{syntmjat}. Muuttujalla $R$ kuvataan päätöksentekijän hyväksymisprosenttia, eli sitä prosentuaalista osuutta henkilöistä, joilla on pienin vaara epätoivottavaan tulokseen ja joille siten voidaan antaa myönteinen päätös. $X$ ilmentää henkilön henkilökohtaisia ominaisuuksia, jotka ovat sekä päätöksentekijän että mallin havaittavissa. Muuttuja $X$ voi olla esimerkiksi jonkinlainen rekisteritieto, kuten ikä tai sukupuoli. Muuttuja $Z$ on muuttuja, jonka tuomari tai muu asiantuntija voi havaita, mutta joka on mallilta piilotettu. Muuttujan $Z$ voidaan ajatella esimerkiksi oikeuskäsittelyjen tapauksessa kuvaavan epäillyn kääytöstä oikeussalissa. Tulosmuuttuja $Y$ ja päätösmuuttuja $T$ ovat kaksiarvoisia ja niiden määrittelyt on esitelty kuvassa \ref{valikoitumisharha}: myönteistä päätöstä merkitään $t=1$, kielteistä $t=0$. Vastaavasti myönteinen tulos määritellään muuttujan $y$ arvoksi 1, kielteinen arvoksi 0. +% +%Mallin määrittelevä graafi on estetty kuviossa \ref{final_model} ilman virhemuuttujia. Graafista voidaan suoraan lukea oletukset: oletetaan, että $Z \independent X, R$ mutta laajennetaan Lakkarajun oletuksia sallimalla muuttujan X vaikutus muuttujaan R \cite{lakkaraju17}. Mallin oletetuilla kausaalisilla vaikutuksilla on lisäksi selkeästi ilmaistavat realisaatiot: kuinka osuuden $R$ muuttaminen vaikuttaa päätökseen ja edelleen päätös tulokseen ja niin edelleen. +% +%\begin{table} %[H] +%\centering +%\begin{tabular}{rl} +%\hline \hline +%Muuttuja & Kuvaus \\ +%\hline +% R & Myönteisten päätösten osuus prosentteina $r \in [0, 1]$ \\ +% X & Kirjatut muuttujat, havaittavissa kaikille \\ +% Z & Kirjaamattomat muuttujat, vain päättäjän havaitsemat\\ +% Y & Tulosmuuttuja, $y \in \{0, 1\}$\\ +% T & Päätösmuuttuja, $t \in \{0, 1\}$\\ +%\hline \hline +%\end{tabular} +%\caption{Mallin muuttujien selitteet} +%\label{syntmjat} +%\end{table} +% +%\begin{figure}% [H] +% \centering +% \begin{subfigure}[b]{0.4\textwidth} +% \includegraphics[width=\textwidth]{final_model} +% \caption{Malli ilman interventiota.} +% \label{final_model} +% \end{subfigure} +% ~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +% %(or a blank line to force the subfigure onto a new line) +% \begin{subfigure}[b]{0.5\textwidth} +% \includegraphics[width=\textwidth]{intervention_model} +% \caption{Malli, johon interventio on merkitty.} +% \label{intervention_model} +% \end{subfigure} +% ~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +% %(or a blank line to force the subfigure onto a new line) +% \caption{Kausaalimallit graafeina.}\label{mallikuvat} +%\end{figure} +% +%Johdetaan muuttujan $R$ kausaalivaikutus muuttujaan $Y$ yli kaikkien ositteiden X. Huomataan, että osuuden $R$ kausaalinen vaikutus voidaan ilmaista suoraan lausekkeella \ref{q_m}, sillä $\pr(Y=0|\text{do}(R=0))=0$ ja siten edelleen +%\begin{equation*} +% \pr(Y=0|\text{do}(R=r))-\pr(Y=0|\text{do}(R=0)) \\ +%% =\: \pr(Y=0|\text{do}(R=r))-0 \\ +% =\: \pr(Y=0|\text{do}(R=r)). +%\end{equation*} +% +%Osoitetaan seuraavaksi, että X on riittävä vaikutusten korjaamiseen määritelmän \ref{takaovi} mukaisesti, kun selvitetään muuttujan R kausaalista vaikutusta muuttujaan Y. Mallista voidaan suoraan lukea, että takaovikriteerin ensimmäinen ehto on voimassa: X ei ole muuttujan R jälkeläinen. Polut, jotka muuttujan X pitää katkaista ollakseen riittävä vaikutusten korjaamiseen ovat $R \leftarrow X \rightarrow Y$, $R \leftarrow X \rightarrow T \rightarrow Y$ ja $R \leftarrow X \rightarrow T \leftarrow Z \rightarrow Y$. Muuttuja X täyttää kuitenkin määritelmän \ref{d_sep} (a)-kohdan ehdon ja siten d-separoi muuttujat R ja Y. Tällöin X on riittävä vaikutusten korjaamiseen ja voidaan hyödyntää Pearlin kaavaa 25 \cite{pearl10}: +% +%\begin{subequations} \label{derivation} +%\begin{align} +% \pr&(Y=0|\text{do}(R=r)) = \sum_x \pr(Y=0| R=r, X=x) \pr(X=x) \label{derivation1} \\ +% &= \sum_x \left( \sum_t \pr(Y=0, T=t| R=r, X=x) \right) \pr(X=x) \label{derivation2} \\ +% &= \sum_x \left( \sum_t \pr(Y=0| T=t, R=r, X=x)\pr(T=t| R=r, X=x) \right) \pr(X=x) \label{derivation3} \\ +% &= \sum_x \pr(Y=0| T=1, R=r, X=x) \pr(T=1| R=r, X=x) \pr(X=x) \label{derivation4} \\ +% &= \sum_x \pr(Y=0| T=1, X=x) \pr(T=1| R=r, X=x) \pr(X=x) \label{derivation5} +%\end{align} +%\end{subequations} +% +%Yllä oleva lauseke on yhtäpitävä myös jatkuville muuttujan $x$ arvoille, kun korvaamme summaukset integraalilla parametriavaruuden yli: $$\pr(Y=0|\text{do}(R=r)) = \int_x \pr(Y=0| T=1, X=x) \pr(T=1| R=r, X=x) \pr(X=x).$$ +% +%\subsection{algo} +% +% +%Pearlin mukaan: +% +%$$P(Y=0|do(R=r), X=x)=P(Y=0|R=r, X=x)=P(Y=0|R=r, X=x, T=1)P(T=1|R=r, X=x)$$ +% +%Mallit vaikutukset laskettiin Pythonilla versio 3.6. Syötteett sklinear mallliin , joka fitattiin testi dataan ja sitten integroitiin eri leniencyn tasoilla muuttujan X parametriavaruuden eli reaaliakselin ylitse. %%%%%%%%% %%%%%%%%% @@ -597,59 +620,84 @@ Mallit vaikutukset laskettiin Pythonilla versio 3.6. Syötteett sklinear mallli \chapter{Tulokset}\label{tulokset} -- se pääkuvaaja vertailuineen -- beta ztan vaikutus? -- erilaiset mallit ja koko käyrä aina 1 asti -> kuinka meillä parempi +Kappaleessa \ref{metodit} selostettuja menetelmiä sovellettiin synteettiseen aineistoon ja tulokset on esitetty kuvassa \ref{tuloskuva}. Kuvista nähdään, että ehdotettu menetelmä pystyy selkeästi arvioimaan ennustemallin todellista suorituskykyä paremmin kuin supistusalgoritmi. Kuvasta \ref{tuloskuva_erotukset} havaitaan lisäksi, kuinka uuden menetelmän arvio virheprosentista vastaa lähes täysin todellista virheprosenttia kaikilla hyväksymisprosenteilla. + +Uuden menetelmän tarkkuuden paraneminen liittyy todennäköisesti siihen, että malli tarkastelee koko aineistoa ja pystyy siten tekemään tarkempia arvioita jo pienemmästä määrästä havaintoja. Suurempi määrä havaintoja näkyy myös keskivirhepalkin pienuutena. -- voidaanko antaa estimaateille mitään luottusvälejä tjsp? +Liitteen X kuvassa Y näkyy myösn, kuinka esittämämme kontrafaktuaalieihin pohjautuvan menetelmän tarkkuus on lähes rriipumaton latentin muuttujan vaikutuksesta,, eli muuttujan $\beta_z$ kertoimesta. Kun beta Z kasvaa viiteen tai kolmeen lakkarajun menetelmä lakee. Liitteessä eesitetään lisäksi lninteimmän hyväksymisprosentin noston vaikutus. Vaikka lakkarajun mentelmän tarkkuus kasvaa, se estimoi silti edelleen huonommin (MAE X vs Y). -\begin{figure}[H] +\begin{figure}% [H] \centering -\includegraphics[width = 0.8\textwidth]{without_unobservables} -\caption{Tulokset kuvana} +\begin{subfigure}[b]{0.475\textwidth} +\includegraphics[width=\textwidth]{sl_thesis_all} +\caption{Virheprosentti hyväksymisprosentin funktiona, pystyviivat kuvaavat keskivirhettä. \\ ~} +\label{tuloskuva} +\end{subfigure} +~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +%(or a blank line to force the subfigure onto a new line) +\begin{subfigure}[b]{0.475\textwidth} +\includegraphics[width=\textwidth]{sl_thesis_all_err} +\caption{Ero todelliseen virheprosenttiin hyväksymisprosentin funktiona, pystyviivat kuvaavat keskivirhettä.} +\label{tuloskuva_erotukset} +\end{subfigure} +~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +%(or a blank line to force the subfigure onto a new line) +\caption{Uuden menetelmän vertailu supistusalgoritmiin. Kuvista havaitaan, kuinka uusi kontrafaktuaaleihin pohjautuva menetelmä (punainen viiva) ennustaa virheprosentin tarkemmin kuin supistusalgoritmi (sininen). Kuvasta nähdään lisäksi, kuinka esitetty menetelmä pystyy ennustamaan todellisen virheprosentin jokaiselle hyväksymisprosentille riippumatta armeliaimman päättäjän myönteisten päätösten määrästä. Havaittujen tulosten perusteella laskettu arvio (vaaleanpunainen viiva) on selkeästi liian pieni ja johtaisi väärään käsitykseen mallin hyvästä suorituskyvystä.} \label{tuloskuva} \end{figure} + + %%%%%%%%% %%%%%%%%% %%%%%%%%% \chapter{Johtopäätökset}\label{diskussio} -- Jatkosuunnitelmat: tutkitaan beta zetan vaikutusta tuloksiin, kuinka hyvin estimoituu. Sovelletaan oikeaan data settiiin. Mielenkiintoiseksi on osoittautunut propublica julkaisun artikkelissa machine bias käyttämä COMPAS-aineisto. +Tässä tutkielmassa esitettiin uusi menetelmä, \emph{kontrafaktuaalinen imputointi}, jonka avulla pystyttiin arvioimaan ennustemallin $\B$ tarkkuutta valikoidusti luokitellussa aineistossa paremmin kuin aikaisemmin kirjallisuudessa esitetyllä supistusalgoritmilla. Menetelmä imputoi puuttuvat tulokset käyttäen kausaalista rakennemallia, kontrafaktuaaleja ja hierarkkista Bayes-mallia. -- Ongelmat / muut huomiot: Tällä aikataululla en ole tehnyt mallin validointeja: onko kausaaliset pathwayt reasonable. Malli itsessään on suhteellisen yksinkertainen joten (KÄSIENHEILUTTELU) on jokseenkin luultavaa, että sinällään mallin spesifionnissa tuskin on mitään virheitä. Voitaisiin ehkä tietenkin koostaa jokseenkin hienosyisempi malli (erilaiset rikoshistoria yms erikseeen) ja jotain. Jvat muuttujat? P-uloitteinen parametriavaruus??? +Tutkielmassa esitettyä työtä voidaan laajentaa monilta osin soveltumaan lukuisiin eri sovellusaloihin. Vastemuuttuja voi olla kategorinen tai jatkuva ja kausaalimallia voidaan laajentaa koskemaan mielivaltaisen vaikeita tilanteita. Lisätutkimuksia voidaan edelleen kohdistaa latentin muuttujan vaikutuksen $\beta_z$ korostumiseen ja epälineaarisiin yhteyksiin selittävien muuttujien $X$ ja $Z$ sekä selitettävän muuttujan $Y$ välillä. Lisäksi menetelmän toimiminen pitää vielä varmentaa jollain todellisella aineistolla. -- Mallin validointi epäeettistä, koska vaatisi huonoja päätöksiä > meillä kyllä synteettinen? +Esitettyä menetelmää voidaan soveltaa aloilla, joilla saatavilla oleva aineisto on valikoidusti luokiteltua, päätöksien teossa käytetään kirjaamatonta tietoa ja halutaan selvittää ihmispäättäjien korvaamista tai tukemista malleilla. Esimerkiksi jos vakuutusyhtiöt haluavat korvata korvauskäsittelijät ennustemalleilla, jotka ennustavat vakuutuksesta saatavaa voittoa, esitetyllä menetelmällä voitaisiin verrata mallin suorituskykyä käsittelijöiden tekemiin päätöksiin. Toisaalta jos oikeuslaitokset haluavat tuoda ennustavat algoritmit mukaan vakuuskäsittelyihin, voitaisiin mallin suorituskykyä arvioida päästämättä vaarallisia henkilöitä vapaaksi. -- Implikaatiot: parempia malleja??? - -%\begin{verbatim} -%# R-koodi, tulos sama -%library(igraph) -%library(causaleffect) -%# simplify = FALSE to allow multiple edges -%g <- graph.formula(X -+ R, X -+ D, X -+ Y, R -+ D , D -+ Y, D -+ Y, Y -+ D, simplify = FALSE) -%# Here the bidirected edge between X and Z is set to be unobserved in graph g -%# This is denoted by giving them a description attribute with the value "U"# The edges in question are the fourth and the fifth edge -%g <- set.edge.attribute(graph = g, name = "description", index = c(6,7), value = "U") -% -%res <- causal.effect("Y", "R", G = g) -%\end{verbatim} %%%%%%%%% -%\nocite{*} +\nocite{*} \bibliographystyle{babplain} \renewcommand{\bibname}{Lähteet} \bibliography{viitteet} -%\begin{appendices} -%\chapter{Abstract in English?} -%The contents... -%\end{appendices} +\begin{appendices} + +\chapter{Lisäkuvaajat} + +\section{Latentin muuttujan vaikutus} + +\begin{figure}% [H] +\centering +\begin{subfigure}[b]{0.475\textwidth} +\includegraphics[width=\textwidth]{sl_thesis_bz3__all} +\caption{Virheprosentti hyväksymisprosentin funktiona, pystyviivat kuvaavat keskivirhettä. \\ ~} +\label{tuloskuva_2} +\end{subfigure} +~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +%(or a blank line to force the subfigure onto a new line) +\begin{subfigure}[b]{0.475\textwidth} +\includegraphics[width=\textwidth]{sl_thesis_bz3__all_err} +\caption{Ero todelliseen virheprosenttiin hyväksymisprosentin funktiona, pystyviivat kuvaavat keskivirhettä.} +\label{tuloskuva_erotukset_2} +\end{subfigure} +~ %add desired spacing between images, e. g. ~, \quad, \qquad, \hfill etc. +%(or a blank line to force the subfigure onto a new line) +\caption{Uuden menetelmän vertailu supistusalgoritmiin, kun latentin muuttujan kerron $\beta_z=3$. Kuvista havaitaan, kuinka uusi kontrafaktuaaleihin pohjautuva menetelmä (punainen viiva) ennustaa virheprosentin edelleen tarkemmin kuin supistusalgoritmi (sininen). Ero on marginaalinen kappaleessa YY esitettyyn.} +\label{tuloskuva_2} +\end{figure} + + +\end{appendices} -\end{document} +\end{document} \ No newline at end of file diff --git a/analysis_and_scripts/code_linear_dependency.stan b/analysis_and_scripts/code_linear_dependency.stan index e17716209dd52d3ba048a6c405391333706c79d3..a85bded2f0516bfeb1a7d1000d3a6b67bd9a72c9 100644 --- a/analysis_and_scripts/code_linear_dependency.stan +++ b/analysis_and_scripts/code_linear_dependency.stan @@ -3,6 +3,7 @@ data { int<lower=0> N_obs; // Number of "observed observations" (with T = 1) int<lower=0> N_cens; // Number of "censored observations" (with T = 0) int<lower=0> M; // Number of judges + real<lower=0> sigma_tau; // Prior for the variance parameters. int<lower=1, upper=M> jj_obs[N_obs]; // judge_ID array int<lower=1, upper=M> jj_cens[N_cens]; // judge_ID array int<lower=0, upper=1> dec_obs[N_obs]; // Decisions for the observed observations @@ -18,8 +19,11 @@ parameters { vector[N_cens] Z_cens; // Intercepts - real alpha_T[M]; - real alpha_Y; + vector<lower=0>[M] sigma_T; + real<lower=0> sigma_Y; + + vector[M] alpha_T_raw; + real alpha_Y_raw; // Temporary variables to compute the coefficients vector[D] a_XT; @@ -41,11 +45,19 @@ transformed parameters { vector[D] beta_XY; real<lower=0> beta_ZT; // Presume latent variable has a positive coefficient. real<lower=0> beta_ZY; + + // Intercepts + vector[M] alpha_T; + real alpha_Y; beta_XT = a_XT / sqrt(tau_XT); beta_XY = a_XY / sqrt(tau_XY); beta_ZT = a_ZT / sqrt(tau_ZT); beta_ZY = a_ZY / sqrt(tau_ZY); + + alpha_T = sigma_T .* alpha_T_raw; + alpha_Y = sigma_Y * alpha_Y_raw; + } model { @@ -54,13 +66,16 @@ model { Z_cens ~ normal(0, 1); // Intercepts - alpha_T ~ normal(0, 5); - alpha_Y ~ normal(0, 5); + sigma_T ~ normal(0, sigma_tau); + sigma_Y ~ normal(0, sigma_tau); + + alpha_T_raw ~ normal(0, 1); + alpha_Y_raw ~ normal(0, 1); // According to // https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations // section "Prior for the regression coefficients in logistic regression - // (non-sparse case)" a good prior is Student's with parameters 3>nu>7, + // (non-sparse case)" a good prior is Student's with parameters 3 < nu < 7, // 0 and 1. // Also, according to @@ -74,11 +89,11 @@ model { a_ZT ~ normal(0, 1); a_ZY ~ normal(0, 1); - // nu = 5 -> nu/2 = 2.5 - tau_XT ~ gamma(2.5, 2.5); - tau_XY ~ gamma(2.5, 2.5); - tau_ZT ~ gamma(2.5, 2.5); - tau_ZY ~ gamma(2.5, 2.5); + // nu = 6 -> nu/2 = 3 + tau_XT ~ gamma(3, 3); + tau_XY ~ gamma(3, 3); + tau_ZT ~ gamma(3, 3); + tau_ZY ~ gamma(3, 3); // Compute the regressions for the observed observations for(i in 1:N_obs){ diff --git a/analysis_and_scripts/stan_modelling_empirical.py b/analysis_and_scripts/stan_modelling_empirical.py index 9468f140387c3088242c5bddfb89c3330fdaa956..5423a56ab0c6b9bfcc957292e95233753d677f71 100644 --- a/analysis_and_scripts/stan_modelling_empirical.py +++ b/analysis_and_scripts/stan_modelling_empirical.py @@ -19,11 +19,13 @@ import numpy as np import pandas as pd import matplotlib.pyplot as plt -import scipy.special as ssp +import numpy.random as npr from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier -import pystan import gc +import psutil +import os +from cmdstanpy import Model plt.switch_backend('agg') @@ -32,6 +34,9 @@ plt.rcParams.update({'figure.figsize': (10, 6)}) import sys +# Seed for reproducibility +npr.seed(123) + # figure storage name save_name = sys.argv[1] + "sl_compas" @@ -55,25 +60,6 @@ print("Number of groups:", group_amount) print("Prior for the variances:", sigma_tau) -def inv_logit(x): - return 1.0 / (1.0 + np.exp(-1.0 * x)) - - -def logit(x): - return np.log(x) - np.log(1.0 - x) - - -def inverse_cumulative(x, mu, sigma): - '''Compute the inverse of the cumulative distribution of logit-normal - distribution at x with parameters mu and sigma (mean and st.dev.).''' - - return inv_logit(ssp.erfinv(2 * x - 1) * np.sqrt(2 * sigma**2) - mu) - -def standardError(p, n): - denominator = p * (1 - p) - - return np.sqrt(denominator / n) - ########################## # ## Evaluator modules @@ -320,7 +306,7 @@ nJudges_M = 10 judge_ID = pd.qcut(np.arange(len(compas_shuffled)), nJudges_M, labels=False) # Assign fixed leniencies from 0.1 to 0.9 -judge_leniency = np.array([0.1, 0.3, 0.5, 0.7, 0.9, 0.1, 0.3, 0.5, 0.7, 0.9]) +judge_leniency = np.array([0.1, 0.3, 0.5, 0.7, 0.9]*2) judge_leniency = judge_leniency[judge_ID] @@ -398,7 +384,7 @@ def drawDiagnostics(title, save_name, f_rates, titles): plt.show() -nIter = 1 +nIter = 10 failure_rates = np.zeros((8, 4)) failure_stds = np.zeros((8, 4)) @@ -408,12 +394,20 @@ f_rate_label = np.zeros((nIter, 8)) f_rate_cont = np.zeros((nIter, 8)) f_rate_cf = np.zeros((nIter, 8)) +# Compile stan model +sm = Model(stan_file=stan_code_file_name) +sm.compile() for i in range(nIter): + + ids = np.arange(5) + selected = ids + npr.choice([0, 5], 5) + + test_labeled = compas_labeled[compas_labeled.judge_ID.isin(selected)] + train = compas_labeled[~compas_labeled.judge_ID.isin(selected)] - # Split data by the judges - train = compas_labeled[compas_labeled.judge_ID <=4] - test_labeled = compas_labeled[compas_labeled.judge_ID >4] + # Renew IDs + test_labeled.loc[:, 'judge_ID'] = test_labeled.judge_ID % 5 # Assign same observations to unlabeled data test_unlabeled = compas_unlabeled.iloc[test_labeled.index.values] @@ -436,12 +430,12 @@ for i in range(nIter): observed = test_labeled['decision_T'] == 1 # Assign data to the model - dat = dict(D=10, - N_obs=np.sum(observed), - N_cens=np.sum(~observed), - K=group_amount, + dat = dict(D=int(10), + N_obs=int(np.sum(observed)), + N_cens=int(np.sum(~observed)), + K=int(group_amount), sigma_tau=sigma_tau, - M=len(set(compas_labeled['judge_ID'])), + M=int(len(set(test_labeled['judge_ID']))), jj_obs=test_labeled.loc[observed, 'judge_ID']+1, jj_cens=test_labeled.loc[~observed, 'judge_ID']+1, kk_obs=kk_array[observed]+1, @@ -452,43 +446,58 @@ for i in range(nIter): X_cens=test_labeled.loc[~observed, feature_cols.values], y_obs=test_labeled.loc[observed, 'result_Y'].astype(int)) - sm = pystan.StanModel(file=stan_code_file_name) - - # Do the sampling - fit = sm.sampling(data=dat, chains=5, iter=6000, control = dict(adapt_delta=0.95)) - - pars = fit.extract() - - plt.figure(figsize=(15,30)) + # Do the sampling + fit = sm.sample(data=dat, chains=4, seed=123, warmup_iters=1500, + sampling_iters=4500, adapt_delta=0.975) + + # Extract predictions + fit_colnames = fit.column_names - fit.plot(); + print("Colnames", fit.column_names) - plt.savefig(save_name + '_stan_convergence_diagnostic_plot_' + str(i)) + pred_cols = [s for s in fit_colnames if 'y_est' in s] + + pars = fit.get_drawset(params=pred_cols) + + fit.get_drawset(params=pred_cols) + + print("Drawset:", fit.get_drawset()) - plt.show() plt.close('all') gc.collect() + gc.collect() - print(fit, file=open(save_name + '_stan_fit_diagnostics_' + str(i) + '.txt', 'w')) - + print(fit.diagnose(), file=open(save_name + '_stan_fit_diagnostics_' + + str(i) + '.txt', 'w')) + # Bayes # Format matrix, each row is a sample of the posterior # columns are observations - - y_imp = np.ones((pars['y_est'].shape[0], test_labeled.shape[0])) - + + #y_imp = np.ones((pars['y_est'].shape[0], test_labeled.shape[0])) + y_imp = np.ones((pars.shape[0], test_labeled.shape[0])) + # Impute the unobserved with the estimated - # Revers the binary coding to compute failures as sum 0 == 0 = 1 - y_imp[:, ~observed] = 1 - pars['y_est'] - - # Remove the variables to conserve memory + # Reverse the binary coding to compute failures as sum. 0 == 0 = 1 + #y_imp[:, ~observed] = 1 - pars['y_est'] + y_imp[:, ~observed] = 1 - pars + + pars = None + fit = None + del(pars) del(fit) + + gc.collect() + gc.collect() + process = psutil.Process(os.getpid()) + print("Memory use after deletion:", process.memory_info().rss) # in bytes # Impute the observed y_imp[:, observed] = 1 - test_labeled.loc[observed, 'result_Y'] + for r in range(1, 9): @@ -553,6 +562,28 @@ plt.savefig(save_name + '_all') plt.show() +# Plot error of the methods (contraction and counterfactual) +# w.r.t True evaluation +for i in range(2, failure_rates.shape[1]): + + error = np.abs(failure_rates[:, 0] - failure_rates[:, i]) + + plt.errorbar(x_ax, + error, + label=labels[i], + c=colours[i], + linestyle=line_styles[i], + yerr=failure_stds[:, i]) + +plt.xlabel('Acceptance rate') +plt.ylabel('Error w.r.t. True evaluation') +plt.legend() +plt.grid() + +plt.savefig(save_name + '_all_err') + +plt.show() + print("\nFailure rates:") print(np.array2string(failure_rates, formatter={'float_kind':lambda x: "%.5f" % x})) diff --git a/analysis_and_scripts/stan_modelling_theoretic.py b/analysis_and_scripts/stan_modelling_theoretic.py index 64ea087d8e9f8a9c9f4cf581b8ab458af710e48c..2dd41a761be9383136d43104c13916330b91ffeb 100644 --- a/analysis_and_scripts/stan_modelling_theoretic.py +++ b/analysis_and_scripts/stan_modelling_theoretic.py @@ -33,12 +33,17 @@ import scipy.special as ssp import numpy.random as npr from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier -from sklearn.model_selection import train_test_split -import pystan import gc +import psutil +import os +from cmdstanpy import Model plt.switch_backend('agg') + +# Seed for reproducibility +npr.seed(123) + import sys # figure storage name @@ -62,6 +67,7 @@ stan_code_file_name = sys.argv[6] # Variance prior sigma_tau = float(sys.argv[7]) + # Settings plt.rcParams.update({'font.size': 16}) @@ -241,6 +247,220 @@ def humanDeciderLakkaraju(df, return df_labeled, df +def thesisDeciderBatch(df, + featureX_col, + featureZ_col=None, + nJudges_M=14, + beta_X=1, + beta_Z=1, + add_epsilon=True, + max_leniency_09=False): + '''Decider module | Non-independent batch decisions. + + 14 or 18 deciders depending on the max leniency. + + Fixed leniencies of .1, .2, ..., .7 or .9. Two per level''' + + if max_leniency_09: + + nJudges_M = 18 + + # Compute the number of subjects allocated for each judge. + nSubjects_N = int(df.shape[0] / nJudges_M) + + # Assign judge IDs as running numbering from 0 to nJudges_M - 1 + df = df.assign(judgeID_J=np.repeat(range(0, nJudges_M), nSubjects_N)) + + # Acceptance rates as specified above + acceptance_rates = np.array([.1, .2, .3, .4, .5, .6, .7, .8, .9] * 2) + + else: + + # Compute the number of subjects allocated for each judge. + nSubjects_N = int(df.shape[0] / nJudges_M) + + # Assign judge IDs as running numbering from 0 to nJudges_M - 1 + df = df.assign(judgeID_J=np.repeat(range(0, nJudges_M), nSubjects_N)) + + # Acceptance rates as specified above + acceptance_rates = np.array([.1, .2, .3, .4, .5, .6, .7] * 2) + + # Replicate the rates so they can be attached to the corresponding judge ID. + df = df.assign(acceptanceRate_R=np.repeat(acceptance_rates, nSubjects_N)) + + if add_epsilon: + epsilon = np.sqrt(0.1) * npr.normal(size=df.shape[0]) + else: + epsilon = 0 + + if featureZ_col is None: + probabilities_T = inverseLogit(beta_X * df[featureX_col] + epsilon) + else: + probabilities_T = inverseLogit(beta_X * df[featureX_col] + + beta_Z * df[featureZ_col] + epsilon) + + df = df.assign(probabilities_T=probabilities_T) + + # Sort by judges then probabilities in decreasing order + # Most dangerous for each judge are at the top. + df.sort_values(by=["judgeID_J", "probabilities_T"], + ascending=False, + inplace=True) + + # Iterate over the data. Subject will be given a negative decision + # if they are in the top (1-r)*100% of the individuals the judge will judge. + # I.e. if their within-judge-index is under 1 - acceptance threshold times + # the number of subjects assigned to each judge they will receive a + # negative decision. + df.reset_index(drop=True, inplace=True) + + df['decision_T'] = np.where((df.index.values % nSubjects_N) < + ((1 - df['acceptanceRate_R']) * nSubjects_N), + 0, 1) + + df_labeled = df.copy() + + # Hide unobserved + df_labeled.loc[df.decision_T == 0, 'result_Y'] = np.nan + + return df_labeled, df + +def thesisDeciderIndependent(df, + featureX_col, + featureZ_col=None, + nJudges_M=14, + beta_X=1, + beta_Z=1, + add_epsilon=True): + '''Decider module | Independent decisions. + + 14 deciders receiving 500 subjects each. + + Fixed leniencies of .1, .2, ..., .7. Two per level''' + + # Compute the number of subjects allocated for each judge. + nSubjects_N = int(df.shape[0] / nJudges_M) + + # Assign judge IDs as running numbering from 0 to nJudges_M - 1 + df = df.assign(judgeID_J=np.repeat(range(0, nJudges_M), nSubjects_N)) + + # Acceptance rates as specified above + acceptance_rates = np.array([.1, .2, .3, .4, .5, .6, .7] * 2) + + # Replicate the rates so they can be attached to the corresponding judge ID. + df = df.assign(acceptanceRate_R=np.repeat(acceptance_rates, nSubjects_N)) + + if add_epsilon: + epsilon = np.sqrt(0.1) * npr.normal(size=df.shape[0]) + else: + epsilon = 0 + + if featureZ_col is None: + probabilities_T = inverseLogit(beta_X * df[featureX_col] + epsilon) + + # Compute the bounds straight from the inverse cumulative. + # Assuming X is N(0, 1) so Var(bX*X)=bX**2*Var(X)=bX**2. + df = df.assign(bounds=inverseCumulative( + x=df.acceptanceRate_R, mu=0, sigma=np.sqrt(beta_X**2))) + else: + probabilities_T = inverseLogit(beta_X * df[featureX_col] + + beta_Z * df[featureZ_col] + epsilon) + + # Compute the bounds straight from the inverse cumulative. + # Assuming X and Z are i.i.d standard Gaussians with variance 1. + # Thus Var(bx*X+bZ*Z)= bX**2*Var(X)+bZ**2*Var(Z). + df = df.assign(bounds=inverseCumulative( + x=df.acceptanceRate_R, mu=0, sigma=np.sqrt(beta_X**2 + beta_Z**2))) + + df = df.assign(probabilities_T=probabilities_T) + + # Assign negative decision if the predicted probability (probabilities_T) is + # over the judge's threshold (bounds). + df = df.assign(decision_T=np.where(df.probabilities_T >= df.bounds, 0, 1)) + + # Calculate the observed acceptance rates. + acceptance_rates = df.groupby('judgeID_J').mean().decision_T.values + + # Replicate the rates so they can be attached to the corresponding judge ID. + df.acceptanceRate_R = np.repeat(acceptance_rates, nSubjects_N) + + df_labeled = df.copy() + + df_labeled.loc[df.decision_T == 0, 'result_Y'] = np.nan + + return df_labeled, df + +def thesisDeciderRandom(df, nJudges_M=14, use_acceptance_rates=False): + '''Doesn't use any information about X and Z to make decisions. + + If use_acceptance_rates is False (default) then all decisions are positive + with probability 0.5. If True, probabilities will be sampled from + U(0.1, 0.9) and rounded to tenth decimal place.''' + + + # Compute the number of subjects allocated for each judge. + nSubjects_N = int(df.shape[0] / nJudges_M) + + # Assign judge IDs as running numbering from 0 to nJudges_M - 1 + df = df.assign(judgeID_J=np.repeat(range(0, nJudges_M), nSubjects_N)) + + if use_acceptance_rates: + # Use fixed acceptance rates + acceptance_rates = np.array([.1, .2, .3, .4, .5, .6, .7] * 2) + else: + # No real leniency here -> set to 0.5. + acceptance_rates = np.ones(nJudges_M) * 0.5 + + # Replicate the rates so they can be attached to the corresponding judge ID. + df = df.assign(acceptanceRate_R=np.repeat(acceptance_rates, nSubjects_N)) + + df = df.assign( + decision_T=npr.binomial(n=1, p=df.acceptanceRate_R, size=df.shape[0])) + + df_labeled = df.copy() + + df_labeled.loc[df.decision_T == 0, 'result_Y'] = np.nan + + return df_labeled, df + +def thesisDeciderBiased(df, + featureX_col, + featureZ_col=None, + nJudges_M=14, + beta_X=1, + beta_Z=1, + add_epsilon=True): + ''' + Biased decider: If X > 1, then X <- X * 0.75. People with high X, + get more positive decisions as they should. And if -2 < X -1, then + X <- X + 0.5. People with X in [-2, 1], get less positive decisions + as they should. + + ''' + + # If X > 1, then X <- X * 0.75. People with high X, get more positive + # decisions as they should + df = df.assign(biased_X=np.where(df[featureX_col] > 1, df[featureX_col] * + 0.75, df[featureX_col])) + + # If -2 < X -1, then X <- X + 0.5. People with X in [-2, 1], get less + # positive decisions as they should + df.biased_X = np.where((df.biased_X > -2) & (df.biased_X < -1) == 1, + df.biased_X + 0.5, df.biased_X) + + # Assert that every judge will have the same number of subjects. + assert df.shape[0] % nJudges_M == 0, "Can't assign subjets evenly!" + + # Use quantile decider, but judge by the biased X. + df_labeled, df = thesisDeciderIndependent(df, + featureX_col='biased_X', + featureZ_col=featureZ_col, + nJudges_M=nJudges_M, + beta_X=beta_X, + beta_Z=beta_Z, + add_epsilon=add_epsilon) + + return df_labeled, df def bernoulliDecider(df, featureX_col, @@ -794,7 +1014,18 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, for i in range(nIter): # Split data - train, test_labeled = train_test_split(df_labeled, test_size=0.5) + #train, test_labeled = train_test_split(df_labeled, test_size=0.5) + + # Split data using judge IDs. + + ids = np.arange(7) + selected = ids + npr.choice([0, 7], 7) + + test_labeled = df_labeled[df_labeled.judgeID_J.isin(selected)] + train = df_labeled[~df_labeled.judgeID_J.isin(selected)] + + # Renew IDs + test_labeled.loc[:, 'judgeID_J'] = test_labeled.judgeID_J % 7 # Assign same observations to unlabeled dat test_unlabeled = df_unlabeled.iloc[test_labeled.index.values] @@ -830,12 +1061,12 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, # Change this assignment if you want to use predictions as input to the # model. ############################### - dat = dict(D=1, - N_obs=np.sum(observed), - N_cens=np.sum(~observed), - K=group_amount, + dat = dict(D=int(1), + N_obs=int(np.sum(observed)), + N_cens=int(np.sum(~observed)), + K=int(group_amount), sigma_tau=sigma_tau, - M=len(set(df_unlabeled['judgeID_J'])), + M=int(len(set(test_labeled['judgeID_J']))), jj_obs=test_labeled.loc[observed, 'judgeID_J']+1, jj_cens=test_labeled.loc[~observed, 'judgeID_J']+1, kk_obs=kk_array[observed]+1, @@ -847,40 +1078,70 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, y_obs=test_labeled.loc[observed, 'result_Y'].astype(int)) # Do the sampling - Change this if you wish to use other methods. - fit = sm.sampling(data=dat, chains=5, iter=5000, control = dict(adapt_delta=0.9)) - - pars = fit.extract() + # See also Stan website https://mc-stan.org for information on + # the prerequisites for reproducing the results. + #fit = sm.sampling(data=dat, chains=5, iter=6000, + # control = dict(adapt_delta=0.99), verbose=True, + # seed=123) + + # CMDstan sampling + + fit = sm.sample(data=dat, chains=4, seed=123, warmup_iters=1500, + sampling_iters=4500, adapt_delta=0.975) + + # Extract predictions + fit_colnames = fit.column_names + + print("Colnames", fit.column_names) + + pred_cols = [s for s in fit_colnames if 'y_est' in s] + + pars = fit.get_drawset(params=pred_cols) + fit.get_drawset(params=pred_cols) + + print("Drawset:", fit.get_drawset()) + + process = psutil.Process(os.getpid()) + print("Memory use after fit:", process.memory_info().rss) # in bytes - plt.figure(figsize=(15,30)) - - fit.plot(); - - plt.savefig(save_name + '_stan_convergence_diagnostic_plot_' + str(i)) - - plt.show() plt.close('all') gc.collect() + gc.collect() - print(fit, file=open(save_name + '_stan_fit_diagnostics_' + str(i) + '.txt', 'w')) + print(fit.diagnose(), file=open(save_name + '_stan_fit_diagnostics_' + + str(i) + '.txt', 'w')) # Bayes # Format matrix, each row is a sample of the posterior # columns are observations - y_imp = np.ones((pars['y_est'].shape[0], test_labeled.shape[0])) - + #y_imp = np.ones((pars['y_est'].shape[0], test_labeled.shape[0])) + y_imp = np.ones((pars.shape[0], test_labeled.shape[0])) + # Impute the unobserved with the estimated # Reverse the binary coding to compute failures as sum. 0 == 0 = 1 - y_imp[:, ~observed] = 1 - pars['y_est'] - + #y_imp[:, ~observed] = 1 - pars['y_est'] + y_imp[:, ~observed] = 1 - pars + # Remove the variables to conserve memory + print("Memory use before deletion:", process.memory_info().rss) # in bytes + print("Size of pars before delete:", sys.getsizeof(pars)) + print("Size of fit before delete:", sys.getsizeof(fit)) + + pars = None + fit = None + del(pars) del(fit) - gc.collect() + gc.collect() + gc.collect() + + process = psutil.Process(os.getpid()) + print("Memory use after deletion:", process.memory_info().rss) # in bytes # Impute the observed y_imp[:, observed] = 1 - test_labeled.loc[observed, 'result_Y'] @@ -916,10 +1177,10 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, failure_rates[:, 2] = np.mean(f_rate_cont, axis=0) failure_rates[:, 3] = np.mean(f_rate_cf, axis=0) - failure_stds[:, 0] = np.std(f_rate_true, axis=0) - failure_stds[:, 1] = np.std(f_rate_label, axis=0) - failure_stds[:, 2] = np.std(f_rate_cont, axis=0) - failure_stds[:, 3] = np.std(f_rate_cf, axis=0) + failure_stds[:, 0] = np.std(f_rate_true, axis=0, ddof=1) + failure_stds[:, 1] = np.std(f_rate_label, axis=0, ddof=1) + failure_stds[:, 2] = np.std(f_rate_cont, axis=0, ddof=1) + failure_stds[:, 3] = np.std(f_rate_cf, axis=0, ddof=1) x_ax = np.arange(0.1, 0.9, 0.1) @@ -930,6 +1191,7 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, line_styles = ['--', ':', '-.', '-'] + # General plot: Failure rate vs. Acceptance rate for i in range(failure_rates.shape[1]): plt.errorbar(x_ax, failure_rates[:, i], @@ -938,7 +1200,6 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, linestyle=line_styles[i], yerr=failure_stds[:, i]) - #plt.title('Failure rate vs. Acceptance rate') plt.xlabel('Acceptance rate') plt.ylabel('Failure rate') plt.legend() @@ -947,6 +1208,39 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, plt.savefig(save_name + '_all') plt.show() + plt.close('all') + gc.collect() + gc.collect() + + # Plot error of the methods (contraction and counterfactual) + # w.r.t True evaluation + for i in range(2, failure_rates.shape[1]): + + error = np.abs(failure_rates[:, 0] - failure_rates[:, i]) + + plt.errorbar(x_ax, + error, + label=labels[i], + c=colours[i], + linestyle=line_styles[i], + yerr=failure_stds[:, i]) + + plt.xlabel('Acceptance rate') + plt.ylabel('Error w.r.t. True evaluation') + plt.legend() + plt.grid() + + plt.savefig(save_name + '_all_err') + + plt.show() + + plt.close('all') + gc.collect() + gc.collect() + + print("\Single runs:") + print(np.array2string(f_rate_true, f_rate_label, f_rate_cont, f_rate_cf, + formatter={'float_kind':lambda x: "%.7f" % x})) print("\nFailure rates:") print(np.array2string(failure_rates, formatter={'float_kind':lambda x: "%.5f" % x})) @@ -967,271 +1261,145 @@ def perfComp(dgModule, deciderModule, title, save_name, model_type=None, titles=labels) # Compile stan model -sm = pystan.StanModel(file=stan_code_file_name) +sm = Model(stan_file=stan_code_file_name) +sm.compile() -if which == 1: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: random and random") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: randomDecider(x, nJudges_M=M_sim, use_acceptance_rates=True) +process = psutil.Process(os.getpid()) +print("Memory use before analysis:", process.memory_info()) # in bytes - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="fully_random", - fit_with_Z=False - ) +if which == 0: + print("\nWith unobservables (Bernoullian outcome + batch decisions)") + print("\nFixed leniency levels") -plt.close('all') -gc.collect() + dg = lambda : bernoulliDGWithUnobservables(N_total=7000) -if which == 2: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: random and y ~ x") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: randomDecider(x, nJudges_M=M_sim, use_acceptance_rates=True) + decider = lambda x: thesisDeciderBatch( + x, featureX_col="X", featureZ_col='Z', beta_X=1, beta_Z=1) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and batch decisions", + figure_path + "sl_dependent", model_type="lr", - fit_with_Z=False + fit_with_Z=False, nIter=1 ) -if which == 3: +if which == 1: print("\nWith unobservables (Bernoullian outcome + independent decisions)") + print("\nFixed leniency levels") - print("Decision-maker in the data and model: random and y ~ x + z") + print("\nDecision-maker in the data and model: y ~ x + z and y ~ x") - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) + dg = lambda: bernoulliDGWithUnobservables(N_total=7000) - decider = lambda x: randomDecider(x, nJudges_M=M_sim, use_acceptance_rates=True) + decider = lambda x: thesisDeciderIndependent( + x, featureX_col="X", featureZ_col='Z', beta_X=1, beta_Z=1) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and independent decisions", + figure_path + "sl_independent", model_type="lr", - fit_with_Z=True - ) - -if which == 4: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: y ~ x and random") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col=None, nJudges_M=M_sim, beta_X=1, beta_Z=1) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="fully_random", fit_with_Z=False ) - -if which == 5: + +if which == 2: print("\nWith unobservables (Bernoullian outcome + independent decisions)") - print("Decision-maker in the data and model: y ~ x and y ~ x") + print("Decision-maker in the data and model: random and y ~ x") - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) + dg = lambda: bernoulliDGWithUnobservables(N_total=7000) - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col=None, nJudges_M=M_sim, beta_X=1, beta_Z=1) + decider = lambda x: thesisDeciderRandom(x, nJudges_M=M_sim, use_acceptance_rates=True) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Bernoulli + random decisions, with unobservables", + figure_path + "sl_bernoulli_random_decisions", model_type="lr", fit_with_Z=False ) -if which == 6: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") +if which == 3: + print("\nWith unobservables (Bernoullian outcome + batch decisions)") + print("\nFixed leniency levels until 0.9") - print("Decision-maker in the data and model: y ~ x and y ~ x + z") + dg = lambda : bernoulliDGWithUnobservables(N_total=9000) - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col=None, nJudges_M=M_sim, beta_X=1, beta_Z=1) + decider = lambda x: thesisDeciderBatch( + x, featureX_col="X", featureZ_col='Z', beta_X=1, beta_Z=1, + max_leniency_09=True) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and batch decisions", + figure_path + "sl_dependent_r_max_09", model_type="lr", - fit_with_Z=True - ) - -if which == 7: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: y ~ x + z and random") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="fully_random", fit_with_Z=False ) -if which == 8: +if which == 4: print("\nWith unobservables (Bernoullian outcome + independent decisions)") + print("\nFixed leniency levels") - print("Decision-maker in the data and model: y ~ x + z and y ~ x") + print("\nDecision-maker in the data and model: y ~ x + z and y ~ x") - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) + dg = lambda: bernoulliDGWithUnobservables(N_total=7000) - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) + decider = lambda x: thesisDeciderBiased( + x, featureX_col='X', featureZ_col='Z', beta_X=1, beta_Z=1) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and biased decisions", + figure_path + "sl_biased", model_type="lr", fit_with_Z=False ) -if which == 9: +if which == 5: print("\nWith unobservables (Bernoullian outcome + independent decisions)") + print("\nFixed leniency levels") - print("Decision-maker in the data and model: y ~ x + z and y ~ x + z") + print("\nDecision-maker in the data and model: y ~ x + z and y ~ x") + print("\nBeta_z = 3") - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) + dg = lambda: bernoulliDGWithUnobservables(N_total=7000, beta_Z=3) - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) + decider = lambda x: thesisDeciderIndependent( + x, featureX_col="X", featureZ_col='Z', beta_X=1, beta_Z=3) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and independent decisions", + figure_path + "sl_independent_beta_z_3", model_type="lr", - fit_with_Z=True - ) - -if which == 10: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: biased and random") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: biasDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="fully_random", fit_with_Z=False ) -if which == 11: +if which == 6: print("\nWith unobservables (Bernoullian outcome + independent decisions)") + print("\nFixed leniency levels") - print("Decision-maker in the data and model: biased and y ~ x") + print("\nDecision-maker in the data and model: y ~ x + z and y ~ x") + print("\nBeta_z = 5") - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) + dg = lambda: bernoulliDGWithUnobservables(N_total=7000, beta_Z=5) - decider = lambda x: biasDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) + decider = lambda x: thesisDeciderIndependent( + x, featureX_col="X", featureZ_col='Z', beta_X=1, beta_Z=5) perfComp( dg, lambda x: decider(x), "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", + "Result from Bernoulli and independent decisions", + figure_path + "sl_independent_beta_z_5", model_type="lr", fit_with_Z=False ) - -if which == 12: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Decision-maker in the data and model: biased and y ~ x + z") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: biasDecider( - x, featureX_col="X", featureZ_col='Z', nJudges_M=M_sim, beta_X=1, beta_Z=1) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="lr", - fit_with_Z=True - ) - -if which == 13: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Fewer subjects per decision-maker, from 500 to 100. Now N_total =", N_sim / 5) - - dg = lambda: bernoulliDGWithUnobservables(N_total=int(N_sim / 5)) - - decider = lambda x: quantileDecider( - x, featureX_col="X", featureZ_col=None, nJudges_M=M_sim, beta_X=1, beta_Z=1) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="lr", - fit_with_Z=True - ) - -if which == 14: - print("\nWith unobservables (Bernoullian outcome + independent decisions)") - - print("Now R ~ Uniform(0.1, 0.4)") - - dg = lambda: bernoulliDGWithUnobservables(N_total=N_sim) - - decider = lambda x: quantileDecider(x, featureX_col="X", featureZ_col=None, - nJudges_M=M_sim, beta_X=1, beta_Z=1, - leniency_upper_limit=0.4) - - perfComp( - dg, lambda x: decider(x), - "Fluctuation of failure rate estimates across iterations\n" + - "Bernoulli + independent decisions, without unobservables", - figure_path + "sl_bernoulli_independent_without_Z", - model_type="lr", - fit_with_Z=True - ) diff --git a/figures/sl_thesis_all.png b/figures/sl_thesis_all.png new file mode 100644 index 0000000000000000000000000000000000000000..db658d1f570fbd7b7d2722d14f1b72eeb82af1ee Binary files /dev/null and b/figures/sl_thesis_all.png differ diff --git a/figures/sl_thesis_all_err.png b/figures/sl_thesis_all_err.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdb91b6deb372335eb45414b8f3e9ace243f263 Binary files /dev/null and b/figures/sl_thesis_all_err.png differ diff --git a/figures/sl_thesis_bZ3__all.png b/figures/sl_thesis_bZ3__all.png new file mode 100644 index 0000000000000000000000000000000000000000..fab0e86c3a8ed6d7d221ac46cefb7a97e2ec9f94 Binary files /dev/null and b/figures/sl_thesis_bZ3__all.png differ diff --git a/figures/sl_thesis_bZ3__all_err.png b/figures/sl_thesis_bZ3__all_err.png new file mode 100644 index 0000000000000000000000000000000000000000..da630885792a02b597893db9f28e5878941546ca Binary files /dev/null and b/figures/sl_thesis_bZ3__all_err.png differ diff --git a/viitteet.bib b/viitteet.bib index b51b30e246f98fababfce1c120e195349115ca4f..62a4dae3c996f36152a78c0c1d33dfb447b417a5 100644 --- a/viitteet.bib +++ b/viitteet.bib @@ -8,14 +8,14 @@ location = {Halifax, NS, Canada}, pages = {275--284}, numpages = {10}, - url = {http://doi.acm.org.libproxy.helsinki.fi/10.1145/3097983.3098066}, + url = {http://doi.acm.org/10.1145/3097983.3098066}, doi = {10.1145/3097983.3098066}, acmid = {3098066}, publisher = {ACM}, address = {New York, NY, USA}, keywords = {evaluating machine learning algorithms, selective labels, unmeasured confounders, unobservables}, language = {finnish} -} +} @Article{pearl10, Author="Judea Pearl", @@ -150,7 +150,7 @@ language={finnish} } -@booklet{tira, +@booklet{kivinen18, author = "Jyrki Kivinen", title = "Tietorakenteet ja algoritmit", year = "2018", @@ -168,5 +168,43 @@ journal={Journal of Machine Learning Research}, volume={12}, pages={2825--2830}, - year={2011} -} \ No newline at end of file + year={2011}, + language={finnish} +} + +@article{willmott05, + title={Advantages of the mean absolute error (MAE) over the root mean square error (RMSE) in assessing average model performance}, + author={Willmott, Cort J and Matsuura, Kenji}, + journal={Climate research}, + volume={30}, + number={1}, + pages={79--82}, + year={2005}, + language={finnish} +} + +@article{stan, + author = {Bob Carpenter and Andrew Gelman and Matthew Hoffman and Daniel Lee and Ben Goodrich and Michael Betancourt and Marcus Brubaker and Jiqiang Guo and Peter Li and Allen Riddell}, + title = {Stan: A Probabilistic Programming Language}, + journal = {Journal of Statistical Software, Articles}, + volume = {76}, + number = {1}, + year = {2017}, + keywords = {probabilistic programming; Bayesian inference; algorithmic differentiation; Stan}, + abstract = {Stan is a probabilistic programming language for specifying statistical models. A Stan program imperatively defines a log probability function over parameters conditioned on specified data and constants. As of version 2.14.0, Stan provides full Bayesian inference for continuous-variable models through Markov chain Monte Carlo methods such as the No-U-Turn sampler, an adaptive form of Hamiltonian Monte Carlo sampling. Penalized maximum likelihood estimates are calculated using optimization methods such as the limited memory Broyden-Fletcher-Goldfarb-Shanno algorithm. Stan is also a platform for computing log densities and their gradients and Hessians, which can be used in alternative algorithms such as variational Bayes, expectation propagation, and marginal inference using approximate integration. To this end, Stan is set up so that the densities, gradients, and Hessians, along with intermediate quantities of the algorithm such as acceptance probabilities, are easily accessible. Stan can be called from the command line using the cmdstan package, through R using the rstan package, and through Python using the pystan package. All three interfaces support sampling and optimization-based inference with diagnostics and posterior analysis. rstan and pystan also provide access to log probabilities, gradients, Hessians, parameter transforms, and specialized plotting.}, + issn = {1548-7660}, + pages = {1--32}, + doi = {10.18637/jss.v076.i01}, + url = {https://www.jstatsoft.org/v076/i01}, + language={finnish} +} + +@manual{compas, + title={Practitioner’s Guide to COMPAS Core}, + url={https://assets.documentcloud.org/documents/2840784/Practitioner-s-Guide-to-COMPAS-Core.pdf}, + organization = {Northpointe}, + year={2015}, + month={maaliskuu}, + note = {viitattu 4.10.2019}, + language={finnish} +} \ No newline at end of file