Syödyt ateriat

Mitä aterioita kukin tutkittava söi?

Seuraavassa esimerkissä tavoitteeni on luoda uudet muuttujat, joista käy ilmi mitä aterioita ja missä paikoissa kukin tukittava söi kunakin tallennettuna päivänä.

Käytän tähän ruokalajitason dataa ja poimin sieltä kolme muuttujaa: tutkittavan id-numero, tallennetun päivän järjestysnumero ja yllä kuvattu ateria/paikka-koodi.

#luetaan data sisään.
rldata = read.csv("Z:/MyDocuments/blogi/ruokalaji/blogi_ruokalajitaso_161209.csv", sep=";", header = T)

#vaihdetaan IvName-muuttujan nimeksi ID_child.
names(rldata)[names(rldata)=="IvName"] <- "ID_child"

################

#poimitaan tarvittavat muuttujat.
myvars <- c("ID_child", "DaDay", "MaName")
MaNamedata <- rldata[myvars]

#tehdään taulukko, jossa kullekin tutkittavalle on vain yksi rivi.
#sarakkeet muodostetaan ensin päivän numeron mukaan ja sen jälkeen ateria/paikka-koodin mukaan.
ftable(MaNamedata, row.vars = c("ID_child"), col.vars = c("DaDay", "MaName"))

Tästä taulukosta voi siis lukea, että ylimmän rivin lapsi söi päivänä 1 aamupalan kotona ja kyseiseen aamupalaan tallennettiin kaksi ruokakoodia. Toisella rivillä oleva lapsi söi päivänä 1 aamiaisen päiväkodissa. Päivänä 2 hän söi kaksi aamiasta, yhden kotona ja toisen päiväkodissa.

ftable3

Seuraavaksi yllä tehty taulukko pitää vielä muuttaa data frame-muotoon. Alla oleva koodi tekee sen, mutta samalla menetetään muuttujien nimet ja ne pitää laittaa paikoilleen jälkikäteen. (Otan mielelläni vastaan vinkkejä, miten tämän vaiheen voisi toteuttaa suoraviivaisemmin.)

#muutetaan taulukko data frame-muotoon, jolloin siinä on vain yksi rivi muuttujien nimille.
ftMaName<-ftable(MaNamedata, row.vars = c("ID_child"), col.vars = c("DaDay", "MaName"))
ateriat<-data.frame(expand.grid(rev(attr(ftMaName, "row.vars"))), unclass(ftMaName))

head(ateriat)


#nimetään ateria/paikka-muuttujat uudelleen.
colnames(ateriat)[2] <- "A_k_1"
colnames(ateriat)[3] <- "A_m_1"
colnames(ateriat)[4] <- "A_pk_1"
...ja niin edelleen...
colnames(ateriat)[86] <- "V_k_4"
colnames(ateriat)[87] <- "V_m_4"
colnames(ateriat)[88] <- "V_pk_4"
colnames(ateriat)[89] <- "V_r_4"
head(ateriat)

#tarkistaan, että muuttujien nimet ovat nyt paikoillaan.
head(ateriat)

Viimeksi muokattu 25.3.2019

Raaka-aineen vaihtotoiminto

Käytännön kokemuksemme DAGIS-hankkeen aineiston tallennus- ja tarkistustyössä AivoDiet-ohjelmalla ovat osoittaneet, että helpointa on joko olla kokonaan käyttämättä raaka-aineen vaihtomahdollisuutta tai käyttää tätä mahdollisuutta kussakin reseptissä korkeintaan yhdellä raaka-ainerivillä. Jos päätät käyttää korkeintaan yhtä vaihtoa kussakin reseptissä, vaihtojen osalta riittää, että muistat alla olevat kolme sääntöä (ja lisäksi kirjoituksen lopussa olevan vinkin)*.

  • Kun luot reseptin, päätä mille riville annat vaihtomahdollisuuden. Kun olet valinnut rivin, älä muuta enää mieltäsi. Vaihtomahdollisuuden poistaminen tai lisääminen jälkikäteen voi sekoittaa aiempien ruokapäiväkirjojen tulokset.
  • Riville, jolla on reseptillinen tuote, ei saa lisätä vaihtomahdollisuutta.

  • Vaihtotuote ei koskaan saa olla reseptillinen (eikä vaihtolistalle siis tule lisätä reseptillisiä ruokakoodeja), sillä ohjelma ei osaa hajottaa vaihtotuotetta raaka-aineisiin. Esimerkiksi reseptin ainesosana olevaa tomaattimurskaa ei saa vaihtotoiminnolla vaihtaa tomaattikastikkeeseen, joka koostuu useista eri raaka-aineista.

AivoDiet-ohjelmassa on sallittua käyttää kussakin reseptissä raaka-aineen vaihtomahdollisuutta kahdella rivillä. Jos päätät käyttää kahta vaihtoa reseptissä, lue alla olevat ohjeet huolellisesti. Jos näitä ohjeita ei noudata, on todennäköistä, että ravintoaineiden saantituloksiin ja raaka-aineiden käyttömäärätuloksiin tulee virheitä. Lue myös kirjoituksen lopussa oleva vinkki*.

  • Raaka-aineen vaihtomahdollisuuden voi laittaa korkeintaan kahdelle reseptin riville. Ohjelma ei anna mitään varoitusta, vaikka laittaisit kolmannelle riville vaihtomahdollisuuden. Tämä voi kuitenkin sekoittaa laskennan.
  • Molemmat vaihtomahdollisuudet kannattaa laittaa silloin, kun resepti luodaan ensimmäisen kerran. Niitä ei tule myöhemmin poistaa tai niiden paikkaa vaihtaa.
  • Jos reseptiin ei ole aiemmin laitettu vaihtomahdollisuuksia, siihen voi lisätä yhden tai kaksi vaihtomahdollisuutta. Mikäli lisäät kaksi, molemmat tulee lisätä samaan aikaan.
  • Jos tiettyä reseptiä, jossa on yksi vaihtomahdollisuus, on jo käytetty tallennuksessa, uuden vaihtomahdollisuuden lisääminen myöhemmin tähän reseptiin voi sotkea vaihdot tämän reseptin osalta aiemmissa tallennuksissa. Tällöin ravintoaineiden saantituloksiin ja raaka-aineiden käyttömäärätuloksiin voi tulla virheitä.
  • Samassa reseptissä ei saa olla kahta saman ryhmän vaihtomahdollisuutta. Esimerkiksi salaattireseptiin ei saa laittaa kahdelle eri riville vaihtomahdollisuutta ryhmälle ”kasvikset”.
  • Riville, jolla on reseptillinen tuote, ei saa lisätä vaihtomahdollisuutta.

  • Vaihtotuote ei koskaan saa olla reseptillinen (eikä vaihtolistalle siis tule lisätä reseptillisiä ruokakoodeja), sillä ohjelma ei osaa hajottaa vaihtotuotetta raaka-aineisiin. Esimerkiksi reseptin ainesosana olevaa tomaattimurskaa ei saa vaihtotoiminnolla vaihtaa tomaattikastikkeeseen, joka koostuu useista eri raaka-aineista.

*Lopuksi vinkki: Tutkimusryhmän sisällä on hyvä sopia säännöt, mitä tuotteita voi vaihtaa vaihtotoiminnolla ja mihin tuotteisiin. En suosittele esimerkiksi jauhelihakeitossa olevan naudan jauhelihan vaihtamista kirjoloheksi. Teknisesti tässä ei olisi varsinaista ongelmaa, ja ravintoaineiden saantikin tulisi lasketuksi oikein. Ongelma syntyisi siitä, että tällainen vaihto muuttaa jauhelihakeiton kalakeitoksi, mutta tuotteen nimi pysyy edelleen jauhelihakeittona. Tämä johtaisi väärin tuloksiin, kun aineistosta lasketaan elintarvikeluokkien grammamääräisiä käyttömääriä. Koodit luokitellaan elintarvikeluokkiin nimen perusteella ja tässä esimerkissä tutkittavan syömä kirjolohikeitto tulisi lasketuksi elintarvikeluokkaan ”lihakeitot”, eli väärään luokkaan.

Ruoka-aineen vaihtolistojen sisältöä voit muokata avaamalla ohjelman valikosta ”Taulukot” > ”Ruoka-ainevaihdot”. Avaa samanaikaisesti ”Taulukot” > ”Tuotteet”. Voit hiirellä vetämällä siirtää uuden tuotteen vaihtotaulukkoon.

Viimeksi päivitetty 3.11.2017

Jos VLOOKUP ei toimi

Joskus Excelin VLOOKUP ei toimi, vaikka olet kirjoittanut kaavan oikein. Tällaisessa tilanteessa kannattaa ensinnäkin tarkistaa että solut, joista etsitään ja solu, joka osoittaa mitä etsitään, on määritelty samoin (Format Cells > General).

Toiseksi kannattaa kokeilla seuraavaa: aktivoi sarake, valitse Data > Text to Columns. Valitse Delimited, klikkaa seuraava, valitse Tab, klikkaa seuraava ja Finish.

Jos VLOOKUP ei edelleenkään toimi, tarkista vielä kerran kaavasi ja etsi lisää vinkkejä googlaamalla.

Aterian nimi ja paikka

Tallennus

DAGIS-hankkeessa meitä kiinnostaa tehdä analyysejä, joissa eritellään päiväkodissa syöty ruoka ja muualla syöty ruoka. Haluamme myös, että aineistosta voidaan tarkastella eri ateriatyyppien merkitystä ruokavaliossa. AivoDiet-ohjeman tallennuksessa on käytettävissä kaksi ateriakohtaista vapaata kenttää, joihin tällaisia tietoja voi tallentaa:

– kenttä ”Tyyppi”, johon mahtuu kolme merkkiä
– kenttä ”Nimi”, johon mahtuu hieman pidempi teksti

(Huom. Kenttien ”% päivästä” ja ”Huomautus” tiedot eivät siirry output-tiedostoon, joten näihin kenttiin ei kannata tallentaa tietoja, joita tarvitaan myöhemmin datan analysoinnissa.)

DAGIS-hankkeessa päätimme tallennusvaiheessa merkitä tiedon sekä aterian tyypistä että paikasta kenttään ”Nimi”. Tätä varten sovimme seuraavat koodit:

Ateria
A aamupala
L lounas
P päivällinen
I iltapala
V välipala (myös napostelu)
M muu (esim. pelkkä juoma, ravintovalmisteet)

Paikka
k koti
pk päiväkoti (myös päiväkodin retket ja juhlat)
r ravintola (esim. pikaruokapaikat, kahvilat, huoltoasemat, lounasravintolat)
m muualla (esim. kylässä toisen kotona, eväät, piknik, auto, mökillä)

Näistä muodostetaan tarvittava yhdistelmä, esimerkiksi lounas kotona saa ateria/paikka-koodin L_k

Viimeksi muokattu 25.3.2019

Päivien lukumäärä

Tutkittavia pyydetään tavallisesti pitämään ruokapäiväkirjaa tietyn ajanjakson, esimerkiksi kolmen päivän ajan. On kuitenkin tavallista, että osa tutkittavista pitää sitä vain yhden tai kaksi päivää. Tutkittava on myös saattanut kirjata osan päivistä niin puutteellisesti, että ne päätetään jättää tallentamatta.

Kullekin tutkittavalle aineistosta löytyvien päivien lukumäärän voi poimia AivoDiet:n outputista erilliseksi muuttujaksi alla kuvatulla tavalla. Mikä tahansa päivämäärä, jolle on tallennettu edes yksi tuote, tulee tässä huomioiduksi. (Jos puutteellisesti kirjattuja päiviä on tallennettu AivoDiet-ohjelmaan ja ne halutaan poistaa, se pitää siis tehdä erikseen.)

#poimitaan muuttujat ID_child ja DaDate
myvars <- c("ID_child", "DaDate")
daydata <- rldata[myvars]

# lasketaan montako uniikkia päivämäärää kullakin henkilöllä on
numdays <-with(daydata, tapply(DaDate, ID_child, FUN = function(x) length(unique(x))))

# ja muutetaan edellisen tulos data-muotoon
rldatanumdays <- data.frame(ID_child=names(numdays),n_days=numdays)

head(rldatanumdays, n=10)

#tehdään tiedostosta .txt-muotoinen.
write.table(rldatanumdays, "Z:/MyDocuments/blogi/ruokalaji/rldatanumdays.txt", sep="\t", col.names=NA)

Elintarvike- ja raaka-aineluokat

Elintarvikeluokat

Ruoankäyttötutkimuksessa elintarvikkeet jaotellaan usein pää- ja alaluokkiin. Luokittelu on tutkijan päätettävissä, mutta suomalainen tutkija voi käyttää Finravinto-tutkimuksissa käytettyä luokittelua  hyvänä ohjenuorana. Finravinto 2007 ja 2012 –raporteissa on liitetaulukot, joissa luetellaan esimerkkejä elintarvikkeista, jotka kuuluvat kuhunkin elintarvikeluokkaan. Esimerkiksi pääluokkaan ”liharuoat” kuuluu alaluokat ”liha- ja makkaraleikkeleet”, ”jauheliharuoat” ja niin edelleen. Elintarvikeluokat sisältävät sekä ruokalajeja (esim. jauhelihalihakeitto) että yksittäisiä elintarvikkeita (esim. meetvursti).

Elintarvikkeiden luokittelu ei ole yksiselitteistä. Esimerkiksi Finravinnossa omenapiirakka kuuluu ”hedelmä- ja marjaruokiin”, mutta yhtä hyvin se voisi kuulua myös ”kakkuihin ja leivoksiin”. Tärkeintä kuitenkin on, että lukijalla on mahdollisimman hyvä käsitys siitä, millaisia ratkaisuja tutkija on tehnyt.

Raaka-aineluokat

Raaka-aineluokittelua varten ruokalajit (esim. jauhelihakeitto) hajotetaan laskennassa raaka-aineikseen (esim. jauheliha, peruna, porkkana, vesi, suola). Tässä luokittelussa keitosta tuleva jauheliha päätyy luokkaan ”liha”, porkkana päätyy luokkaan ”kasvikset” jne. Raaka-aineluokat voivat sisältää myös alaluokkia. Esimerkiksi raaka-ainepääluokka ”hedelmät ja marjat” sisältää Finravinto 2012 -raportissa alaluokat ”hedelmät”, ”hedelmäsäilyke”, ”marjat” ja ”täysmehut”.

Tiedon siirto AivoDietistä

AivoDietissä laskentavaihetta (eli output-tiedoston luomista) kutsutaan ”ravintolaskelman vienniksi” tai ”ravintolaskelman siirroksi”.

Laskennan voi tehdä eri tasoilla:

Saantitaso

Tässä lasketaan energian ja ravintoaineiden kokonaissaanti kutakin tallennettua päivää kohti. Valitse toiminto ”ravintolaskelman vienti” ja tutkittavien ryhmä, jonka haluat laskea. Älä laita rastia kumpaankaan ruutuun.

Ruokalajitaso

Ruokalajitason laskentaa käytetään, kun halutaan raportoida tuloksia elintarvikeluokissa.

Valitse ”ravintolaskelman vienti” ja ryhmä, jonka haluat laskea. Laita rasti ruutuun ”Ruokalajeittain”. Jokaiselle tallennetulle ruoalle tai ruokalajille tulee output-tiedostoon oma rivi.

Raaka-ainetaso

Raaka-ainetason laskentaa käytetään, kun halutaan raportoida tuloksia raaka-aineluokissa.

Valitse ”ravintolaskelman vienti” ja ryhmä, jonka haluat laskea. Laita rasti sekä ruutuun ”Ruokalajeittain” että ”Elintarvikkeet”. Jokaiselle ruokalajin raaka-aineelle tulee output-tiedostoon oma rivi. Ruokalajin nimeä ei ole rivillä lainkaan. Ruoat, joilla ei ole reseptiä, tulevat omille riveilleen samalla tavalla kuin ruokalajitason laskennassa.

Viimeksi päivitetty 31.3.2019

Ruokakoodien luokittelu elintarvikeluokkiin

Jotta tuloksia voi tarkastella jaoteltuna elintarvikeluokittain, jokainen aineiston tallennuksessa käytetty ruokakoodi on määriteltävä kuuluvaksi johonkin elintarvikeluokkaan. Miten tämä tehdään AivoDiet-datalle?

1. Tee ruokalajitason laskenta AivoDietissä

2. Tarkista alustavasti näyttääkö aineisto olevan kunnossa

Avaa Excel > Open. Valitse avautuvan ikkunan oikean alakulman alasvetovalikosta ”All files”. Text Import Wizardissa valitse ensin Delimited ja sen jälkeen Tab.

Tarkista näyttääkö kaikki siltä miltä pitääkin. Jos et ole vielä tehnyt perustarkistuksia, voit esimerkiksi järjestää (Custom sort) aineiston energian mukaan nähdäksesi puuttuuko joiltakin ruoilta energian arvoja ja millaiset ovat pienimmät ja suurimmat energiansaannit yksittäisistä ruokakoodeista. Jos virheitä löytyy, palaa AivoDietiin korjaamaan ne ja tee laskenta uudelleen.

3. Listaa kaikki ruokakoodit, joita on käytetty aineistossa vähintään yhden kerran

Tämän voi tehdä nopeasti Excelissä. Tee Pivot-taulukko (ks. Insert) ja valitse siihen mukaan muuttujat ”Code” ja ”Name”. Ylärivin kohdasta Pivot Tools valitse Design > Report layout > Show in Tabular Form.

excel-pivot-1

Kopioi ja liitä (Paste Special > Values) pivot-taulukko uudelle välilehdelle. Voit poistaa ylimpänä ja alimpana olevat turhat rivit. Järjestä (Custom Sort) taulukko niin, että saat listan koodeista. Tallenna uudella nimellä.

Jos löydät listasta virheitä (esimerkiksi ruokakoodeja, joissa on sanaväli) palaa AivoDietiin korjaamaan virheet ja aloita alusta.

4. Luokittele kaikki koodit johonkin elintarvikealaluokkaan

Tämä vaihe on ensimmäisellä kerralla tehtävä käsityönä.

Jos kuitenkin olet jo aiemmin luokitellut osankin listassasi olevista ruokakoodeista, yhdistä listat Excelin VLOOKUP-komennolla.

Vihreällä pojalla näkyy aiemmin tehty lista, jossa esimerkiksi kaikille alaluokkaan ”Tuoreet kasvikset ja kasvissalaatit” kuuluville koodeille on annettu alakuokkakoodi 101. Edelleen alaluokkaan ”kasviskeitot ja -kastikkeet” kuuluville koodeille on annettu luokkakoodi 102. (Luokkakoodit voivat olla mitä tahansa koodinumeroita, jotka noudattavat jotakin itsellesi sopivaa logiikkaa.) Oikealla näkyy lista ruokakoodeista, joka tehtiin Pivot-toiminnolla kohdassa 3. VLOOKUP-komento etsii oikeanpuolimmaisen listan koodinumeroa punaisella viivalla rajatulta alueelta ja jos se löytää osuman, se kopioi listan kolmannesta sarakkeesta (C) arvon ja siirtää sen sarakkeeseen E. Jos ruokakoodia ei löydy punaisella viivalla rajatulta alueelta, komento kirjoittaa soluun #N/A.

vlookup-1Tallenna uudella nimellä.

Katso myös: Jos VLOOKUP ei toimi.

Aineiston perustarkistukset

Jokaisessa tutkimushankkeessa on hyvä sopia omat periaatteet ruoankäyttöaineistojen tarkistukseen. Tutkimuskysymys vaikuttaa siihen, mitä ja miten tarkistetaan. Perustarkistukset on kuitenkin syytä tehdä aina. Energiansaanti tarkistetaan aina ja ravintoaineista tarkistetaan ne, joista on aikomus raportoida tuloksia.

Ensin tarkistetaan ovatko energian ja ravintoaineiden saannin tunnusluvut (esim. keskiarvot) odotusten mukaiset. Seuraavaksi poimitaan aineistosta tutkittavat, joilla on pienimmät ja suurimmat saannit (esim. jakauman 5-10 pienintä ja 5-10 suurinta arvoa). Nämä listat käydään läpi kohta kohdalta ja palataan laskentaohjelmaan tarkistamaan, johtuuko poikkeuksellisen suuri tai pieni saanti jostakin virheestä. Usein ääriarvoille löytyy luonnollinen selitys ja niille ei tarvitse tehdä mitään.

Mahdollisia virhelähteitä:

  • tallennusvirhe
  • virhe reseptin ainesosien suhteissa
  • virhe reseptin haihtumishävikki- tai ravintoaineen kypsennyshävikkikertoimessa
  • virhe elintarvikkeen koostumustiedoissa

Energian ja ravintoaineiden saantien perustarkistus

Alla on esimerkki tarkistuslistojen tekemisestä R:llä.

Tee AivoDietissä laskenta saantitasolla. Avaa se Excelissä ja tallenna .csv-muodossa. Lue data sisään R-ohjelmaan:

perustarkistus 2a

Kuvailevat tunnusluvut kaikista aineiston muuttujista:

summary(saantidata)

Ääriarvojen tarkastelu:

#luodaan tulostiedosto.
sink("Z:/MyDocuments/blogi/saanti/min_ja_max_170307.txt")

#tehdään listat: energiansaannin 5 suurinta ja 5 pienintä arvoa, id ja päivämäärä.
myvars <- c("ID_child", "DaDate", "ENERJ")
ENERJd <- saantidata[myvars]

print("max")
ENERJ_outliers <- ENERJd[order(ENERJd$ENERJ, decreasing = T),]
head(ENERJ_outliers, n=5)

print("min")
ENERJ_outliers <- ENERJd[order(ENERJd$ENERJ, decreasing = F),]
head(ENERJ_outliers, n=5)

#tehdään listat: proteiininsaannin 5 suurinta ja 5 pienintä arvoa, id ja päivämäärä.
myvars <- c("ID_child", "DaDate", "PROT")
PROTd <- saantidata[myvars]

print("max")
PROT_outliers <- PROTd[order(PROTd$PROT, decreasing = T),]
head(PROT_outliers, n=5)

print("min")
PROT_outliers <- PROTd[order(PROTd$PROT, decreasing = F),]
head(PROT_outliers, n=5)

#suljetaan tulostiedosto.
sink()

Tulostiedosto näyttää tältä:

tarkistus min ja max e

Viimeksi päivitetty 7.3.2017