Toon posts:

Database structuur microarray data

Pagina: 1
Acties:

Verwijderd

Topicstarter
[situatieschets]
De laatste jaren is in medische biologie een bepaalde techniek zeer populair geworden, namelijk de microarray techniek. Hiermee kun je van een bepaald weefsel in 1 keer de eiwit expressie van (op dit moment maximaal) 20.000 genen tegelijk meten. Hiermee komt een schat aan informatie vrij over ziekte en gezondheid. Ik werk aan een onderzoek waarbij we van 300 patienten materiaal hebben verzameld, en nu hebben we dus 300 x 20.000 datapunten.
Ik wil deze data graag in een database hebben, om het gemakkelijk te kunnen relateren aan andere data of om queries op te kunnen uitvoeren.

[probleem]
In wat voor soort datastructuur sla je 300 records met 20.000 variabelen op? Een optie is om het gewoon in een tabel op te slaan. Maar wat nu als je een querie wil met alleen bepaalde kolommen? "select kolom1, kolom2, .... kolom 13786 from tabel " is niet echt efficient.

[oplossing tot nu toe]
Wat ik tot nu toe heb gedaan om selecties te kunnen maken op de dataset, of het te relateren aan andere data, is het als tab-delimited file opslaan en vervolgens een perl script geschreven die alle data in een array kwakt, om vervolgens de hele set te doorlopen. Kolom identifiers en rij identifiers worden apart geprocessed, zodat er externe data uit een MySQL-database aan gerelateerd kan worden. (Of eigenlijk andersom; een selectie van de data wordt gemaakt door het te relateren aan externe data). Dit is flexibel tot op zekere hoogte; bovendien loop ik telkens tegen kleine praktische problemen aan die dan weer tijd kosten om op te lossen.

Wat ik nu precies wil? Ik wil graag weten of er vanuit de informatie technologie datastructuren en misschien zelfs applicaties (liefst open source natuurlijk) bekend zijn om met dergelijke datasets om te gaan. Ik weet een beetje van biologie en een beetje van informatica, maar loop nu tegen mijn beperkingen in het laatste aan. Misschien is dit voor echte informatici een situatie die ze dagelijks tegen komen. :)

Verwijderd

Datastructuur zou ik zoiets doen als dit, ff snel opgezet:

[Gen]
GenId
GenOms

[Probe]
ProbeId
ProbeOms

[GenProbe]
GenId
ProbeId
Value

Maar van dit soort datasets met die hoeveelheid kolommen, heb ik eigenlijk nog nooit gehoord, misschien dat er op de uni's etc. speciale db's voor zijn?

[ Voor 35% gewijzigd door Verwijderd op 25-07-2003 10:23 ]


Verwijderd

Topicstarter
Verwijderd schreef op 25 July 2003 @ 10:21:
Datastructuur zou ik zoiets doen als dit, ff snel opgezet:

[Gen]
GenId
GenOms

[Probe]
ProbeId
ProbeOms

[GenProbe]
GenId
ProbeId
Value

Maar van dit soort datasets met die hoeveelheid kolommen, heb ik eigenlijk nog nooit gehoord, misschien dat er op de uni's etc. speciale db's voor zijn?
Iets dergelijks hebben we nu ook. Maar het gaat dan dus vooral om hoe je de wat jij noemt [GenProbe] tabel opzet.

Deze techniek is behoorlijk nieuw, echt van de laatste paar jaar. Wat je ziet is dat heel veel mensen met dit probleem bezig zijn en dat er niet echt generieke oplossingen voor zijn.

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

De oplossing die maui71 geeft is eigenlijk doodnormale normalisatie.

Wat is het 'probleem' bij het gebruik van een dergelijke kruistabel?

Klaar voor een nieuwe uitdaging.


Verwijderd

Verwijderd schreef op 25 juli 2003 @ 10:36:
[...]


Iets dergelijks hebben we nu ook. Maar het gaat dan dus vooral om hoe je de wat jij noemt [GenProbe] tabel opzet.

Deze techniek is behoorlijk nieuw, echt van de laatste paar jaar. Wat je ziet is dat heel veel mensen met dit probleem bezig zijn en dat er niet echt generieke oplossingen voor zijn.
Je kan daar natuurlijk nog andere dingen in opnemen die van belang zijn bij je query's, echter is moeilijk zo te zeggen, zonder de wetenschap wat eventuele selectie criteria zijn. Je zou bv. aan een Gen of aan een Probe kenmerken ?? (heb daar niet veel vestand van) kunnen koppelen, via de waardes van die kenmerken kan je dan weer selecties uitvoeren.

Verwijderd

Topicstarter
chem schreef op 25 July 2003 @ 10:40:
De oplossing die maui71 geeft is eigenlijk doodnormale normalisatie.

Wat is het 'probleem' bij het gebruik van een dergelijke kruistabel?
Dat een select querie niet echt lekker werkt met dergelijke queries :). Er zijn namelijk 20.000 variabelen. Ik heb deze variabelen ook in andere tabel staan, maar dan als records, met informatie over deze variabelen. Stel nu dat ik in die tabel een querie doe om bepaalde variabelen met een gemeenschappelijke eigenschap te selecteren. Hoe koppel ik deze selectie querie dan vervolgens aan de data tabel waar deze zelfde variabelen geen records vormen, maar daadwerkelijk variabelen? Ik kan daar wel een script voor schrijven, om die twee dingen te koppelen, maar ik wil niet voor iedere vraag die ik heb een nieuw script moeten schrijven. Ook vind ik het idee van een tabel met > 20.000 een beetje raar, ik weet eigenlijk niet of standaard databases als Access en MySQl zoveel variabelen tegelijk aan kunnen.

Het probleem is wat mij betreft niet of er oplossingen voor zijn, maar of er generieke database structuren voor te verzinnen zijn die verder gaan dan dit model. Want ik denk dat dit model niet het meest handig is, maar weet ook niet wat dan wel het meest handig is.

[ Voor 11% gewijzigd door Verwijderd op 25-07-2003 11:00 ]


Verwijderd

Topicstarter
Om een idee te geven hoe zoiets eruit ziet, hieronder een situatie schets:

Gen-tabelstructuur (>20.000 records):
ID
Gennaam
Description
Functie
Chromosomale locatie
Muizen equivalent
Pathwayinformatie
etc.

Sample-tabelstructuur (300 records):
ID
Naam
geboortedatum
Datum ziekte
Datum overlijden
Chromosomale afwijkingen
Behandelingen


Arraydata-tabelstructuur (300 records):
SampleID
Gen1
Gen2
Gen3
..
..
Gen22833


Zoals ik al eerder zei: ik vind het gevoelsmatig raar om een tabel met 20.000 variabelen te hebben, daarnaast: stel ik doe een querie op een bepaald chromosoom in de gen-tabel en wil weten wat de gemiddelde waarde en standaard deviatie is van de patienten voor alle genen op dat chromosoom. Ik ben geen SQL-guru, maar volgens mij is dat een behoorlijk lastige querie, ik vraag me zelfs of het mogelijk.

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Ik zie geen lastige query. Met bovenstaande structuur hebben we ook de DB van GoT draaien, en met wel iets meer dan 20k koppelingen :)

Geef eens een voorbeeld zoekopdracht die je zou willen doen.

Klaar voor een nieuwe uitdaging.


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Je moet de Arraydata gewoon nog eens opsplitsen, naar 2 tabellen: SampleID, GenID en Value.

Als je dan wil weten welke Sample's een Value hebben van 'x' bij GenID 'y':

code:
1
2
3
4
5
6
7
8
9
10
SELECT 
    ...
FROM 
    CrossTable
LEFT JOIN 
    GenTable ON (GenTable.GenID = CrossTable.GenID)
LEFT JOIN 
    SampleTable ON (SampleTable.SampleID = CrossTable.SampleID)
WHERE 
    CrossTable.Value = 'x' AND CrossTable.GenID = 'y'

Klaar voor een nieuwe uitdaging.


Verwijderd

Topicstarter
Ik ben nog even aan het zoeken geweest; Mysql kan maximaal 3400 columns aan; Access 255, PostgreSql zit ook onder die 3400.

[ Voor 26% gewijzigd door Verwijderd op 25-07-2003 11:21 ]


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Verwijderd schreef op 25 July 2003 @ 11:20:
Ik ben nog even aan het zoeken geweest; Mysql kan maximaal 3400 columns aan; Access 255, PostgreSql zit ook onder die 3400.
Zie bovenstaande post :)

meer dan 50 kolommen is eigenlijk vrijwel nooit nodig. Meer dan 10 is al veel.

Klaar voor een nieuwe uitdaging.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 25 July 2003 @ 11:20:
Ik ben nog even aan het zoeken geweest; Mysql kan maximaal 3400 columns aan; Access 255, PostgreSql zit ook onder die 3400.
Ja, maar ik zie hier geen probleem in? Een item heeft neem ik aan geen 3400 unieke kenmerken?
Het aantal records kan in de miljoenen lopen, da's geen probleem.

[ Voor 11% gewijzigd door gorgi_19 op 25-07-2003 11:23 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Wat ik de arraydata-tabel heb genoemd, zou 300 records met 20.000 columns zijn. Om 1 record inderdaad 20.000 unieke kenmerken heeft! Dat is de kern van mijn probleem.

Een record uit die arraydata-tabel ziet er dus zo uit:
code:
1
2
3
SampleID     GenID   GenID    GenID           GenID

Sample123  waarde1 waarde 2 waarde3 ... ... waarde22833

Overigens bedankt voor het meedenken zover!

[ Voor 31% gewijzigd door Verwijderd op 25-07-2003 11:29 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Kan je het niet omdraaien? ipv Iedere sample heeft een x aantal gens, heeft iedere gen bij een sample een waarde?

Verder zie ik niet in wat er fout is aan een query als:

Select waarde FROM Gen where SampleID = '123'

(en dan ws nog een join er bij.. ;))

[ Voor 40% gewijzigd door gorgi_19 op 25-07-2003 11:33 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 04-08 07:59

chem

Reist de wereld rond

Uhm, ik kan het nog wel 3x zeggen :P maar je moet dus een tabel maken die alle genid <> waarde's bevat per sample.
Dan maken het aantal genid's etc. niks meer uit.

Klaar voor een nieuwe uitdaging.


Verwijderd

[Gen] - 20.000 records
GenId
GenOms
+ Rest van GEN gegevens

[Sample] - 300 records
SampleId
SampleOms
+ Rest van Sample gegevens

[GenSample] - 20.000 * 300 = 6.000.000 records
GenId
SampleId
Value

Is de enige manier om die 20.000 kolommen te voorkomen :)

[ Voor 11% gewijzigd door Verwijderd op 25-07-2003 11:37 ]


Verwijderd

Topicstarter
Ah, ik snap eigenlijk nu pas wat je bedoelt :D
Daar had ik nog niet aan gedacht, dat zou inderdaad wel eens een oplossing kunnen zijn. Ik ga daar eens aan werken!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 18:15

The Eagle

I wear my sunglasses at night

Moet het per se een relationele DB zijn? Kijk anders eens naar een netwerk- of ketting DBMS...zou ook best wel eens handig kunnen zijn, omdat je dan echt vanalles aan elkaar kunt linken

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
The_Eagle schreef op 25 July 2003 @ 11:39:
Moet het per se een relationele DB zijn? Kijk anders eens naar een netwerk- of ketting DBMS...zou ook best wel eens handig kunnen zijn, omdat je dan echt vanalles aan elkaar kunt linken
Ik denk dat ik met de oplossing van chem en maui17 wel wat kan (eigenlijk supersimpel, stom dat ik daar zelf niet op ben gekomen), maar waar ik eigenlijk vanuit was gegaan was dat ik niet een relationele database nodig had maar iets anders. Heb je een link met wat info over netwerk- en/of ketting DBMS'en? Ben wel nieuwsgierig wat je daar mee kunt.

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 18:15

The Eagle

I wear my sunglasses at night

Verwijderd schreef op 25 July 2003 @ 11:47:
[...]


Ik denk dat ik met de oplossing van chem en maui17 wel wat kan (eigenlijk supersimpel, stom dat ik daar zelf niet op ben gekomen), maar waar ik eigenlijk vanuit was gegaan was dat ik niet een relationele database nodig had maar iets anders. Heb je een link met wat info over netwerk- en/of ketting DBMS'en? Ben wel nieuwsgierig wat je daar mee kunt.
Nee heb ik zo niet, maar Google is your friend :P

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
The_Eagle schreef op 25 July 2003 @ 11:52:
[...]


Nee heb ik zo niet, maar Google is your friend :P
Not in this case, already tried :P

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Hmm. Grappig daar is me broer ook mee bezig! Je bent toevallig niet me broer he :+ (Teun?)

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
alienfruit schreef op 25 July 2003 @ 12:29:
Hmm. Grappig daar is me broer ook mee bezig! Je bent toevallig niet me broer he :+ (Teun?)
:o

Pas de replâtrage, la structure est pourrie.


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

chem schreef op 25 July 2003 @ 11:32:
[..]standaard developer praatje[..]
Wat, Normaliseren? Brrr..

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat nog wel een probleem met deze structuur kan zijn is als je alle samples met gen1 = 10, gen2 = 40, .... gen100 = 30 wilt

Dus een beetje fikse hoeveelheid voorwaarden, dan krijg je in theorie zo'n soort query:
select ...
from sampletabel
join gentabel g1 ...
....
join gentabel g100
where
g1.waarde =
...
and g100.waarde = ...

Zo'n query zal mysql iig niet bijster efficient uitvoeren en ik weet ook niet hoe fijn postgresql dat vind, maar als dat geen probleem is, dan lijkt me dit een betere datastructuur dan een record met 20000 waarden proberen te maken :o

Overigens kent postgresql ook nog een array-type, waarmee je in theorie (en in de praktijk kom je aardig ver) ook die 20.000 waarden in kan gooien.
Die kan je dan ala "select ... from gentabel where genarray[1] = ... etc" aanspreken. Overigens kunnen daar ook binnen Postgres indices op aangelegd worden om het zoeken in zo'n array wat te versnellen (de zgn gist indices).
Pagina: 1