Werk & Studie alle pijlers

Random partitioning (statistiek/programmeren)

11-03-2014 20:10 17 berichten
Alle reacties Link kopieren
Ik weet precies wat ik wil, maar niet hoe ik het moet doen.



Ik heb een (erg grote) dataset. Zoiets:

caseIVDV1DV2DV3DV4DV5...DV400114531495276...89211624394542...51...........................2323449593731...762422345605559...63



24 cases dus, die elk ofwel tot level 1 ofwel tot level 2 van de onafhankelijke variabele horen. Voor iedere case heb ik ook een groot aantal afhankelijke variabelen. Nu wil ik kijken of mijn data anders zijn dan in het geval van random partitioning. Ik wil dus cases random aan level 1 dan wel 2 gaan hangen (waarbij het belangrijk is dat elke rij van DVs aan elkaar gekoppeld blijft). Dit x 1000 en dan wil ik de gemiddelden weergeven van 1 en 2 (apart voor iedere DV). Maar hoe doe ik dit?



Ik kan 1000 kolommen met random 1-en en 2-en genereren en deze aan de set toevoegen. Dat lukt, maar ik krijg maar niet uitgevogeld hoe ik per kolom een nieuwe rij van gemiddelden kan krijgen. Tot zover heb ik SPSS gebruikt, maar ik zou ook andere software kunnen gebruiken.



Ik heb gegoogeld op random partitioning en script (en dan nog eventueel een softwarepakket), maar ik vermoed dat ik niet de juiste zoektermen gebruik. Heeft iemand hier toevallig een lumineus inzicht?
Talk dirty to me.
Alle reacties Link kopieren
Is dit niet gewoon met excel te doen ?



datarange opgeven waarvan je het gemiddelde wilt hebben en excel rekent het voor je uit.
Niet geschoten is altijd mis
Alle reacties Link kopieren
Heb je toegang tot Sas? Mogelijk is dit wat je zoekt: http://www.scsug.org/SCSU ... AtRandomHettinger2011.pdf
beetje handige huisvrouw slaat een stel drukknopen in het kruis
Alle reacties Link kopieren
Nou ja, in theorie wel. Met SPSS ook. Maar ik wil juist iets doen waardoor ik niet 1000 keer hoef te klikken. Ik zou dus eerst 1000 keer het gemiddelde moeten berekenen en vervolgens daar weer het gemiddelde van. Voor die 1000 keer het gemiddelde aan de hand van de 1-en en 2-en wil ik dus iets wat automatischer kan. Ik dacht een loop, maar weet niet zo goed wat er dan in die loop moet.
Talk dirty to me.
Alle reacties Link kopieren
Schrijf je toch gewoon een array in SAS?
beetje handige huisvrouw slaat een stel drukknopen in het kruis
Alle reacties Link kopieren
je zou een stukje code kunnen schrijven dat na 1 klik 1000 random getallen genereerd in de juiste velden.
Niet geschoten is altijd mis
Alle reacties Link kopieren
Geen SAS helaas. Ik probeerde het met SPSS syntax, maar dat lukte me dus niet. Ik denk dat SPSS het wel kan, trouwens, maar ik niet.
Talk dirty to me.
Alle reacties Link kopieren
Misschien is het probleem toch niet helemaal duidelijk nog. Ik heb dus een stukje code nu die de 1-en en 2-en genereert. Voor elke kolom staan die 1-en en 2-en dus verschillend. Nu wil ik voor elk van die 1000 kolommen met 1-en en 2-en twee nieuwe rijen maken met het gemiddelde van elk van de DVs voor level 1 en 2 (en later neem ik dan het gemiddelde van elke level). Ik kom dus juist niet van die 1000 kolommen naar die 2000 rijen die ik wil. Een script dus, maar ik weet niet zo goed waar ik moet beginnen.
Talk dirty to me.
Alle reacties Link kopieren
En normaal zou ik hier bij SPSS "aggregate" gebruiken, maar dan zou ik dus 1000 files met 2 rijen genereren die dan later samengevoegd moeten worden. Dat leek me ook een minder handige oplossing.
Talk dirty to me.
Alle reacties Link kopieren
En in R? Dat kan je gratis downloaden?
beetje handige huisvrouw slaat een stel drukknopen in het kruis
Alle reacties Link kopieren
Het is mij niet duidelijk waar die getallen in de DV kolommen vandaan komen
Niet geschoten is altijd mis
Alle reacties Link kopieren
quote:fancypants schreef op 11 maart 2014 @ 21:02:

En in R? Dat kan je gratis downloaden?Ja, in R dat zou kunnen of anders in Matlab, als je daarin loops over kolommen kan maken. Ik hoopte dat eigenlijk te vermijden omdat ik die programma's allebei niet echt goed ken. Enig idee waar ik het beste op zou kunnen zoeken qua functies in één van die twee programma's?
Talk dirty to me.
Alle reacties Link kopieren
quote:Bitje93 schreef op 11 maart 2014 @ 21:03:

Het is mij niet duidelijk waar die getallen in de DV kolommen vandaan komenDat zijn mijn data, de dependent variables.
Talk dirty to me.
Het volgende is misschien niet heel duidelijk opgeschreven, maar hopelijk kun je er toch wel wijs uit.



Wat handig is om je te bedenken: als je voor een gegenereerde dataset weet hoeveel cases er bij level 1 horen, weet je ook hoeveel er bij level 2 horen, namelijk

24- het aantal cases bij level 1.

Als je daarnaast, weer voor een random gegenereerde dataset, weet wat, voor een gegeven DV, de som is van de waarden van die DV voor alle cases met level 1, noem die som even SomLevel1, dan kun je ook de twee gemiddelden die je nodig hebt, uitrekenen. Definieer ook nog, voor diezelfde vaste DV, SomTotaal, de som over alle 24 cases voor die DV.

Het gemiddelde voor de level 1 cases is dan

SomLevel1/aantal cases met level 1

Het gemiddelde voor de level 2 cases is

(SomTotaal - SomLevel1)/(24- aantal cases met level 1).



SomTotaal is onafhankelijk van je rijtje enen en tweeën. Die hoef je dus voor elke DV maar 1 keer uit te rekenen. Dat doe je vooraf.



Voor elk van je 1000 gegenereerde rijtjes enen en tweeën (die hoef je op zich niet eens vooraf te genereren, kan ook onderweg) moet je dus uitrekenen hoeveel enen je hebt gegenereerd, en je moet voor elk van de 400 DV's uitrekenen wat de som van de waarden voor die DV bij de level 1 -cases is.

Daarmee kun je voor iedere set enen en tweeën de corresponderende gemiddeldes uitrekenen - en dat kan gewoon in je eigen favoriete programma.
Alle reacties Link kopieren
quote:Miffy schreef op 11 maart 2014 @ 23:23:

Het gemiddelde voor de level 2 cases is

(SomTotaal - SomLevel1)/(24- aantal cases met level 1).



O ja, dat scheelt weer!



Ik ben ervan overtuigd dat ik met Matlab aan de slag moet. Even logisch gezien, zouden mijn stappen kunnen zijn:



1) Ik genereer 1000 kolommen van 1 en 2 in Matlab.

2) Voor elk van de 1000 kolommen bereken ik per DV een gemiddelde voor level 1.

3) Daarvan leid ik af het gemiddelde van level 2.

4) Ik maak een gemiddelde voor elk van de twee levels gebaseerd op 1000 "cases".



Stap 2 is denk ik het lastigst. Ik moet dus een loop in een loop doen, denk ik? Van DV1 tot DV400 per kolom en dan daar omheen van gegeneerde kolom 1 tot kolom 1000. En helemaal binnenin moet dan dat ik wil dat voor elke 1 hij de bijbehorende waarde van de DV opzoekt, en optelt bij het totaal van die DV tot dusver (en dat is dan nog een loop, drie loops dus?). En aan het einde van de binnenste loop deel je dat dan door het aantal enen (welke ik in mijn geval altijd precies de helft, 12 dus, wil laten zijn) voor het gemiddelde.



Ik ben benieuwd of het zo dan gaat lukken. Lijkt wel meer een weektaak dan die twee uurtjes die ik er oorspronkelijk voor uitgetrokken had.
Talk dirty to me.
Oh, wacht, dat had ik even gemist. Als je uiteindelijk alleen een gemiddelde over alle 1000 experimenten nodig hebt, hoef je natuurlijk de 2x1000x400=80.000 tussengemiddden niet allemaal expliciet te genereren en op te slaan. Je zou het dan ook kunnen zien alsof je een gemiddelde berekent over een veel grotere tabel dan in de openingspost staat, namelijk eentje waarin alle 1000 experimenten onder elkaar staan (met 24x1000 rijen, dus). Per DV kun je dan in 1 keer het gemiddelde betekenen, in plaats van dat eerst per experiment te doen en daarna te gaan middelen over experimenten.

Je krijgt dan een loop in een loop in een loop. In pseudocode wordt het zoiets: (niet echt heel leesbaar op t forum )



For i = 1 to 1000 *loop over experimenten*

For j = 1 to 24 *loop over cases*

Zoek in je vooraf gedefinieerde rijtje op of case j in experiment i level 1 of 2 was (of genereer hier je random enen en tweeën)

If ( level voor case j in experiment i =1)

Then for k = 1 to 400 *loop over DVs*

SomLevel1DV[k]= SomLevel1DV[k]+ waarde DV[k] voor case j

End *loop over DVs*

End if *NB voor de level 2 cases hoef je niets te doen!*

End *loop over cases*

End *loop over experimenten*



Het gemiddeld over alle level 1 cases in alle experimenten voor DV nummer k is dan

SomLevel1DV[k]/(1000*12),

en het gemiddelde voor level 2 kun je nu ook betekenen.

Dit kun je gewoon doen in de taal waar je het meest vertrouwd mee bent. De volgorde waarin je de loops nest, kan natuurlijk ook anders.
Alle reacties Link kopieren
Jaaa, dank je! Dit helpt ontzettend!



(Ik heb, zoals vast duidelijk is, niet heel veel scriptervaring. Maar nu de logica van wat ik wil in ieder geval duidelijk is, krijg ik de rest hopelijk bij elkaar gevonden.)
Talk dirty to me.

Dit is een oud topic. Het topic is daarom gesloten.
Maak een nieuw topic aan om verder praten over dit onderwerp.

Terug naar boven