Haaste koodaajille: IBS-laskuri

Apuohjelmia eri tieteenaloille.

Haaste koodaajille: IBS-laskuri

ViestiKirjoittaja Jaska » 11 Heinä 2012 01:52

Näyttää pahasti siltä, että pareittaisia IBS-arvoja saa laskettua ainoastaan mutkikkaasti käytettävillä ohjelmilla kuten PLINK, joiden toimimaan saaminen vaatii nelivuotisen koulutuksen.

Esitänkin nyt haasteen koodaajille: ei kai voi olla kovinkaan hankalaa vääntää kasaan koodinpätkää, joka suoriutuisi tällaisesta haasteesta?

Toimitus on sinänsä hyvin yksinkertainen:

1. Family Finder -testin data näyttää tältä Excelillä avattuna:

Kuva

Jos alleelit olisivatkin nätisti omissa sarakkeissaan, Exceliä voisi ehkä hyödyntää laskemisessa, mutta kun ei: kaikki tieto on pitänyt pakata yhteen ja samaan sarakkeeseen.

2. Tarkoitus olisi päästä vertaamaan kahden eri henkilön näytteitä, ja on ihan sama voiko vertailun tehdä kahtena eri tiedostona vai pitääkö tiedostot yhdistää (joko henkilön tai ohjelman toimesta).

3. Käytännössä jokaista locusta eli riviä verrataan näiden kahden henkilön välillä: jos A:lla on tulos GG ja B:llä tulos AA, tulos on 0, jos GG ja AG, tulos on 1, ja jos GG ja GG, tulos on 2. (Sama tietysti myös C- ja T-alleelien kanssa.) Eli vain se merkitsee, montako samaa emästä henkilöt siinä kohden jakavat.

4. Sen jälkeen tarvitsisi vain laskea kaikkien rivien (noin 700 000!) keskiarvo. Sisaruksilla sen pitäisi olla noin 1 (locuskohtainen todennäköisyys 0 = 0,25; 1 = 0,5; 2 = 0,25), ja samaan väestöön kuuluvilla suunnilleen 0,8 ja eri väestöihin kuuluvilla sitäkin vähemmän.

5. Onnistuisiko? Mikä siinä olisi vaikeinta?
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02

ViestiKirjoittaja Pystynen » 14 Heinä 2012 18:58

Excel tai mikä tahansa muukin taulukkolaskentaohjelma osaa kyllä erotella sarakkeet: kaivele valikoista "Import", avaa raakadata tätä kautta, ja aseta pilkku sarake-erottimeksi.

Tämän jälkeen pulmaksi tulee enää määritellä funktio, joka antaa kahdesta kirjainkoodista oikean numerotuloksen. Karkeasti ottaen seuraava toimisi:

1) Korvataan GCAT numeraaleilla 0123 (tai yhtä hyvin 9418, jos huvittaa) (hoituu jo ihan Notepadin etsi-ja-korvaa-toiminnolla).
2) Sijoitetaan vertailtavat tulokset samaan taulukkoon
3) Lasketaan kustakin 'kromosomiluvusta' X seuraavat: floor(x/10) ja x mod 10 (tämä erottelee 1. ja 2. numerot so. emäkset erilleen).
4) Vertaillaan edellisiä pareittain. Looginen EQUALS tms. funktio pitäisi löytyä joka antaa suoraan 0 jos syötteillä on eri arvo, 1 jos sama.
5) Lasketaan pareittaiset vertailut yhteen. Tästä tulee haluttu 0/1/2-arvo.
6) Lasketaan edellisistä keskiarvo yli kaikkien rivien.

Itse käytän kyllä lähinnä OpenOfficea joten en nyt osaa antaa valmista Excel-funktiota mutta joo, tämä on täysin taulukkolaskettavissa oleva ongelma.
Avatar
Pystynen
SuuBaltti
SuuBaltti
 
Viestit: 1302
Liittynyt: 22 Helmi 2011 22:45
Paikkakunta: Vandaalia

ViestiKirjoittaja Jaska » 14 Heinä 2012 20:26

Pystynen kirjoitti:Excel tai mikä tahansa muukin taulukkolaskentaohjelma osaa kyllä erotella sarakkeet: kaivele valikoista "Import", avaa raakadata tätä kautta, ja aseta pilkku sarake-erottimeksi.

Tämän jälkeen pulmaksi tulee enää määritellä funktio, joka antaa kahdesta kirjainkoodista oikean numerotuloksen. Karkeasti ottaen seuraava toimisi:

1) Korvataan GCAT numeraaleilla 0123 (tai yhtä hyvin 9418, jos huvittaa) (hoituu jo ihan Notepadin etsi-ja-korvaa-toiminnolla).
2) Sijoitetaan vertailtavat tulokset samaan taulukkoon
3) Lasketaan kustakin 'kromosomiluvusta' X seuraavat: floor(x/10) ja x mod 10 (tämä erottelee 1. ja 2. numerot so. emäkset erilleen).
4) Vertaillaan edellisiä pareittain. Looginen EQUALS tms. funktio pitäisi löytyä joka antaa suoraan 0 jos syötteillä on eri arvo, 1 jos sama.
5) Lasketaan pareittaiset vertailut yhteen. Tästä tulee haluttu 0/1/2-arvo.
6) Lasketaan edellisistä keskiarvo yli kaikkien rivien.

Itse käytän kyllä lähinnä OpenOfficea joten en nyt osaa antaa valmista Excel-funktiota mutta joo, tämä on täysin taulukkolaskettavissa oleva ongelma.

Huikeaa, kiitos!
Ainoastaan kohtia 3 ja 4 en ymmärtänyt. Mitä ovat floor ja mod ja miten ne saadaan ohjelmasta esiin?
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02

ViestiKirjoittaja Jaska » 25 Heinä 2012 00:20

Ihan pakko hehkuttaa, että tämä on toteutumassa!
Testivaihe on menossa, ja näyttää kovasti siltä että lähiaikoina saamme helppokäyttöisen IBS-laskurin! :voitto: :aalto:
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02

ViestiKirjoittaja Pystynen » 30 Heinä 2012 12:44

Jaska kirjoitti:Ihan pakko hehkuttaa, että tämä on toteutumassa!

Hmm, eli saitko lisä-apua toisaalta vai jatkanko erikoisfunktioiden sielunelämän selvennystä?

Niin ja... tuli mieleen että ehkä haluatkin emäksiä vertailtavan järjestyksestä riippumatta? Jos AG + GA onkin kakkosen osuma tai AT + TG ykkösen, niin edellä esittämääni lähestymistapaan tulisi muutenkin pari lisämutkaa.
Avatar
Pystynen
SuuBaltti
SuuBaltti
 
Viestit: 1302
Liittynyt: 22 Helmi 2011 22:45
Paikkakunta: Vandaalia

ViestiKirjoittaja Jaska » 30 Heinä 2012 17:50

Pystynen kirjoitti:
Jaska kirjoitti:Ihan pakko hehkuttaa, että tämä on toteutumassa!

Hmm, eli saitko lisä-apua toisaalta vai jatkanko erikoisfunktioiden sielunelämän selvennystä?

Sain apua, foorumilla notkui koodaaja... :)
Mutta erikoisfunktioiden ymmärtäminen varmasti mahdollistaisi monenlaista hyödyllistä, joten mielelläni niistäkin kuulisin lisää.

Pystynen kirjoitti:Niin ja... tuli mieleen että ehkä haluatkin emäksiä vertailtavan järjestyksestä riippumatta? Jos AG + GA onkin kakkosen osuma tai AT + TG ykkösen, niin edellä esittämääni lähestymistapaan tulisi muutenkin pari lisämutkaa.

Ahaa... Joo, noin sen pitäisi mennä.
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02

ViestiKirjoittaja Pystynen » 12 Elo 2012 00:39

Jaska kirjoitti:Mutta erikoisfunktioiden ymmärtäminen varmasti mahdollistaisi monenlaista hyödyllistä, joten mielelläni niistäkin kuulisin lisää.


Nämä ovat tiedonkäsittelyssä ihan yleissivistäviä, joten tässä pikaesittely:
Lattiafunktio. Tämä ei tee mitään sen kummempaa kuin pyöristää alaspäin. Tunnetaan englanniksi yleensä nimellä "floor". Merkitään joskus alapuolisilla hakasulkeilla: ⎣5,85⎦ = 5, jne.
Ylöspäin pyöristää vastaavasti kattofunktio ("ceiling"). ⎡3,01⎤ = 4, jne.

Näiden avulla voi myös irroittaa luvusta sen desimaalit. Esim. 1,4158 ⎣1,4158⎦ = 0,4158. Muita kikkoja esim. ⎡x⎤ ⎣x⎦ = 1 jos x ei ole kokonaisluku, 0 jos on.

Modulaatio. Tunnetaan kansanomaisemmin nimellä "jakojäännös". Merkitään esim. "8 mod 3 = 2" (jakojäännös jaettaessa 8 3:llä on 2; myös: 8 modulo 3 on 2, 8 on kongruentti 2:n kanssa modulo 3), tai triplayhtäläisyysmerkillä: "8 ≣ 2 (mod 3)", joskus myös yläviivoja ja alaindeksejä käyttäen: "8̅₃ = 2̅₃". Noista ensimmäinen on se jota yleensä näkee varsinaisena funktiona. Laskentaohjelmissa se antaa nimenomaan pienimmän jakojäännöksen; muut ovat pikemminkin merkintöjä ekvivalenttiudesta, eli pätee ihan hyvin 8 ≣ 32 ≣ 795 ≣ (mod 3)

Mod 10 on sikäli kätevä, että sillä saa luvusta poistettua kaiken ykkösiä suuremman, esim. 125 mod 10 = 5. Edellä mainitunlaisella operaatiolla saa myös vastaavasti poistettua vain ykköset: 125 (125 mod 10) = 120. (Tai kuten aluksi ehdotin: voi jakaa kymmenellä ja käyttää lattiafunktiota.)

Loogiset funktiot. Nämä käyttävät ns. Boolen algebraa: luku 1 on "tosi", luku 0 on "epätosi".
Väitteen (A ja B) totuusarvo voidaan nyt "laskea" kaavalla A·B: tulos on 1 vain kun sekä A että B ovat 1. Samoin (A tai B) lasketaan modifioidulla yhteenlaskulla, jossa 1 "plus" 1 on edelleen 1. (A poissulkeva tai B) on sekin oma funktionsa, yleensä jotain tyyliin "A xor B". "Yhtäsuuruusfunktio" sitten on 1 jos A = B: "A equals B" tai sulkumerkinnällä "equals(A,B)". Tarkat kirjoitusasut näille löytää ohjelman käyttöohjeista.

Yhtäsuuruusfunktio usein toimii myös muilla syötteillä, ja voi siis esim. verrata equals(3,9) = 0 tai equals(14,14) = 1 (joskus jopa tyyliin equals(banaani,herukka) = 0). Ihan pelkästään tämänkin avulla saisi IBS-arvot irti, kunhan ensin jotenkin erottelee lokusten yksittäiset kromosomit eri sarakkeisiin, pitäisi vain verrata 1. näytteen 1. saraketta molempiin 2. näytteen sarakkeisiin jne. ja lopuksi hieman sieventää tuloksia AA vs. AA antaisi kaikkien pareittaisten osumien summaksi 4 (kun pitäisi olla 2), AG vs. AA antaisi 2 (kun pitäisi olla 1). (Eräs helppo ratkaisu olisi jakaa kahdella ja sitten näyttää kattofunktiota. 4 > 2, 2 >1, 1 > ½ > 1, 0 > 0.)

Edellä en maininnut, mutta usein kätevä on myös merkkifunktio sgn(x): tämä antaa tulokseksi 1 jos luku on positiivinen, -1 jos se on negatiivinen, ja 0 jos se on 0.
Avatar
Pystynen
SuuBaltti
SuuBaltti
 
Viestit: 1302
Liittynyt: 22 Helmi 2011 22:45
Paikkakunta: Vandaalia

ViestiKirjoittaja Jaska » 15 Elo 2012 00:29

Kiitos, noista voi joskus olla hyötyä.

Et sattuisi keksimään, miten Excel osaisi valita kahden vertailtavan sarakkeen tai rivin luvuista aina pienemmän arvon?
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02

ViestiKirjoittaja ajvxyz » 15 Elo 2012 19:35

Esim.

=+MIN(D18:E18)

t.ajvxyz
ajvxyz
Hiljainen hämäläinen
Hiljainen hämäläinen
 
Viestit: 55
Liittynyt: 18 Heinä 2011 15:31

ViestiKirjoittaja Jaska » 16 Elo 2012 02:38

ajvxyz kirjoitti:Esim.

=+MIN(D18:E18)

t.ajvxyz

Sehän toimii! Kiitos, Mr. Mxyzptlk!
~ "Per aspera ad hominem - vaikeuksien kautta henkilökohtaisuuksiin" ~

Y-DNA: N1c1-YP1143 (Olavi Häkkinen 1620 Kuhmo? >> Juhani Häkkinen 1816 Eno)
mtDNA: H5a1e (Elina Mäkilä 1757 Kittilä >> Riitta Sassali 1843 Sodankylä)
Avatar
Jaska
Ylihärmiö
Ylihärmiö
 
Viestit: 10977
Liittynyt: 14 Helmi 2011 04:02


Paluu Tietotekniikka

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 3 vierailijaa