Kysymys
Miten pitäisi laskea tyypillisiä terveysvaikutusarviointien laskutehtäviä R-ohjelmalla?
Vastaus
generic
Tämä koodi sisältää funktiot dropall, PTable, wildcard ja detail.merger.
+ Näytä koodi- Piilota koodi
######################################
## dropall pudottaa data.framesta pois kaikki faktorien sellaiset levelit, joita ei käytetä.
## parametrit: x = data.frame
dropall <- function(x){
isFac <- NULL
for (i in 1:dim(x)[2]){isFac[i] = is.factor(x[ , i])}
for (i in 1:length(isFac)){
x[, i] <- x[, i][ , drop = TRUE]
}
return(x)
}
########################################
#########################################
## PTable muuntaa arvioinnin todennäköisyystaulun sopivaan muotoon arviointia varten.
## Parametrit: P = todennäköisyystaulu Opasnet-kannasta kaivettuna.
## n = iteraatioiden lukumäärä Monte Carlossa
## Todennäköisyystaulun sarakkeiden on oltava: Muuttuja, Selite, Lokaatio, P
## Tuotteena on Monte Carloa varten tehty taulu, jonka sarakkeina ovat
## n (iteraatio) ja kaikki todennäköisyystaulussa olleet selitteet, joiden riveille on arvottu
## lokaatiot niiden todennäköisyyksien mukaisesti, jotka todennäköisyystaulussa oli annettu.
PTable <- function(P, n) {
Pt <- unique(P[,c("Muuttuja", "Selite")])
Pt <- data.frame(Muuttuja = rep(Pt$Muuttuja, n), Selite = rep(Pt$Selite, n), obs = rep(1:n, each = nrow(Pt)), P = runif(n*nrow(Pt), 0, 1))
for(i in 2:nrow(P)){P$Result[i] <- P$Result[i] + ifelse(P$Muuttuja[i] == P$Muuttuja[i-1] & P$Selite[i] == P$Selite[i-1], P$Result[i-1], 0)}
P <- merge(P, Pt)
P <- P[P$P <= P$Result, ]
Pt <- as.data.frame(as.table(tapply(P$Result, as.list(P[, c("Muuttuja", "Selite", "obs")]), min)))
colnames(Pt) <- c("Muuttuja", "Selite", "obs", "Result")
Pt <- Pt[!is.na(P$Result), ]
P <- merge(P, Pt)
P <- P[, !colnames(P) %in% c("Result", "P", "Muuttuja")]
P <- reshape(P, idvar = "obs", timevar = "Selite", v.names = "Lokaatio", direction = "wide")
colnames(P) <- ifelse(substr(colnames(P), 1, 9) == "Lokaatio.", substr(colnames(P), 10,30), colnames(P))
return(P)
}
######################################
################### wildcard laajentaa tähdellä merkityt rivit koskemaan kaikkia sarakkeen arvoja.
## parametrit:
## data: data.frame jonka rivejä laajennetaan
## cols: vektori sarakkeista, jotka käsitellään. Oletusarvona ovat kaikki sarakkeet, jotka sisältävät jossakin ruuduistaan tähden.
wildcard <- function(data, cols = {out <- NA; for(i in 1:ncol(data)) {out[i] <- "*" %in% levels(data[, i])}; colnames(data)[out]}) {
for(i in cols) {
temp <- data.frame(a = levels(data[, i])[levels(data[, i]) != "*"], b = "*")
temp <- merge(data, temp, by.x = i, by.y = "b")
temp <- temp[colnames(temp) != i]
colnames(temp)[colnames(temp) == "a"] <- i
data <- rbind(data[data[i] != "*", ], temp)
}
return(data)
}
##############################
##### detail.merger mergaa 2 "päällekkäistä" mutta eri tarkkuudella ilmoitettua dataa
## parametrit
## data1 (pakollinen): data.frame jossa vähemmän selitteitä (epätarkempi)
## data2 (pakollinen): data.frame jossa enemmän selitteitä (tarkempi)
## rescol1: sarakkeen nimi, josta numeroarvot löytyvät data1:ssä
## rescol2: sma kuin rescol1 mutta data2:lle
## extracells: arvo joka annetaan niille indekseille uudessa taulussa jotka puuttuivat data1:stä niille riveille
## joilla on ilmoitettu "jämät" eli epätarkka arvo - summa tarkemmista uusien indeksien yli
detail.merger <- function(data1, data2, rescol1 = "Result", rescol2 = "Result", extracells = "rest") {
colnames(data1)[colnames(data1)==rescol1] <- "Result1"
colnames(data2)[colnames(data2)==rescol2] <- "Result2"
temp <- as.data.frame(as.table(tapply(data2[,"Result2"], data2[,colnames(data2)%in%colnames(data1)], sum)))
temp <- merge(temp, data1)
temp[,"Result2"] <- temp[,"Result1"] - temp[,"Freq"]
temp[,colnames(data2)[!colnames(data1)%in%colnames(data2)]] <- extracells
out <- rbind(data2, temp[,colnames(temp)%in%colnames(data2)])
colnames(out)[colnames(out)=="Result2"] <- rescol2
out
}
#################################
| |
TODO: {{#todo:Hei! Tarvitsin tuota wildcardia pikaisesti, joten tein sen itse. Eli funktion, joka laajentaa tähdellä merkityt rivit koskemaan kaikkia sarakkeen arvoja. Mutta mitä kuuluu niille funktioille, jotka tuottavat otoksia jakaumista, kuten se 2 - 5? --
Jouni Tuomisto 17. tammikuuta 2012 kello 22.02 (EET)|Teemu Rintala|Opasnet}}
--#: Laitoin yksityiskohtien merge metodin tuohon yllä olvaan koodiin. Input.interp on vielä kesken, mutta eiköhän se nyt pian valmistu. --Teemu R 18. tammikuuta 2012 kello 15.59 (EET)
Huom! On käytettävä include-parametriä näin: include="page:Funktioita_R-toolsiin|name:generic". Eli tuossa on huomattava tuo alaviivan käyttö, välilyönti tuossa sivun nimessä aiheuttaa ongelman.|--Einari Happonen 12. joulukuuta 2011 kello 08.49 (EET)
Perustelut
Tälle sivulle voi listata erilaisia hyödyllisiksi katsottuja funktioita R:ää varten, kunhan ne sopivat yleiseen käyttöön. On tärkeää pitää tämä sivu yhdenmukaisena vastaavan englanninkielisen sivun op_en:Functions for R-tools kanssa, jotta R-koodit toimivat molemmissa wikeissä.
Päätelmiä koodissa olleista virheistä:
- --#: Jos lokaatiot ovat 0.5 ja 1.0, jälkimmäinen muutetaan R:n faktorissa automaattisesti 1:ksi. Jos sen sijaan lokaatioita on 1, 0.5, 1.0 ja joitakin tekstikenttiä, 1 ja 1.0 tulkitaan eri faktorin leveleiksi. Kannattaa siis alunperinkin jättää turhat desimaalit pois datatauluista, jolloin niiden yllättävä tippuminen pois ei aiheuta matchaysongelmia. --Jouni Tuomisto 10. joulukuuta 2011 kello 14.01 (EET)
- --#: Opasnet-kannassa on toiminto, jolla samaa tarkoittavat lokaatiot voidaan yhdistää. Tästä kuitenkin syntyy se ongelma, että kannasta tarjotaan ulos eri lokaatiota kuin mitä sinne on pistetty sisään, esim. lokaation Max sijasta tulee max, ja sitten eri taulujen yhdistäminen R:ssä mergellä ei onnistu. Ehkä tämä toiminnallisuus pitäisi ottaa pois päältä, koska käyttäjä ei juuri voi hallita sitä eikä tunnistaa virhettä. Lisäksi se on muistaakseni toteutettu kannassa siten, että se on universaali, jolloin eri objektien ja actien lokaatiot pakotetaan samaksi, vaikka sama sana eri yhteyksissä oikeasti tarkoittaisi eri asioita. Koko tämä aihe liittyy semanttisiin ongelmiin, joita ei juuri ole Opasnet-kannassa huomioitu ja toteutukset ovat kökköjä kuten tämä. --Jouni Tuomisto 10. joulukuuta 2011 kello 14.01 (EET)
Katso myös
Viitteet
Aiheeseen liittyviä tiedostoja
<mfanonymousfilelist></mfanonymousfilelist>