Ohessa pieni toiminto, jolla R:ssä saa tehtyä lägejä paneelidataan (ilman että tarvii for-luupata dataa, joka on tosi hidasta, jos esim. 10 000 000 havaintoa)...
> ###### Muuttujien viivästäminen (lag) paneelidatassa #### > ## muuttuja > x <- c(1, + 1,4,-4,2,3,6, + 2,4,-3,8, + 10,4,3, + 8) > ## ryhmä id > g <- c(1, + 2,2,2,2,2,2, + 3,3,3,3, + 4,4,4, + 5) > ##### > D <- data.frame(g,x); > D g x 1 1 1 2 2 1 3 2 4 4 2 -4 5 2 2 6 2 3 7 2 6 8 3 2 9 3 4 10 3 -3 11 3 8 12 4 10 13 4 4 14 4 3 15 5 8 > ### Merkki, kun id vaihtuu toiseen > ##$g[i-1] > D$S <- 0; > D$S[1] <- 1; > D g x S 1 1 1 1 2 2 1 0 3 2 4 0 4 2 -4 0 5 2 2 0 6 2 3 0 7 2 6 0 8 3 2 0 9 3 4 0 10 3 -3 0 11 3 8 0 12 4 10 0 13 4 4 0 14 4 3 0 15 5 8 0 > for(i in 2:nrow(D)){ + #print( D$g[i-1] ); + if(D$g[i-1] != D$g[i]) {D$S[i] <- 1}; + }; > D; g x S 1 1 1 1 2 2 1 1 3 2 4 0 4 2 -4 0 5 2 2 0 6 2 3 0 7 2 6 0 8 3 2 1 9 3 4 0 10 3 -3 0 11 3 8 0 12 4 10 1 13 4 4 0 14 4 3 0 15 5 8 1 > ### ¦ R CUR+1,A> > ### Viivästäminen ### > Laggedx <- D$x # pohjustetaan uusi muuttuja > L <- 2; ## viiveperiodien määrä > for(j in 1:L) { + ### + Laggedx <- c(rep(NA,1), Laggedx[(1+j):length(Laggedx)-j]); + Laggedx <- ifelse(D$S==1, NA, Laggedx); + }; > cat("Lopputulos, kun L = ", L, ":\n"); Lopputulos, kun L = 2 : > data.frame(D,Laggedx); g x S Laggedx 1 1 1 1 NA 2 2 1 1 NA 3 2 4 0 NA 4 2 -4 0 1 5 2 2 0 4 6 2 3 0 -4 7 2 6 0 2 8 3 2 1 NA 9 3 4 0 NA 10 3 -3 0 2 11 3 8 0 4 12 4 10 1 NA 13 4 4 0 NA 14 4 3 0 10 15 5 8 1 NA > ###plot(D$x, Laggedx); > ################## > Yhden aikasarjan läggääminen on tietty tosi helppoa tyyliin x <- c(NA, x[2:length(x)]), mutta, kun on noita yksilöitä (g), niin tuo toimenpide ei toimi sellaisenaan. Tossa ohjelmassa hyödynnetään apumuututtujaa S, joka ilmaisee kohdan, jossa id vaihtuu toiseksi. Mulla on aika iso rekisteridata, jota olen jonkin verran esikäsitellyt Survon VARilla (esim. tuossa esim. oleva S). R:ään halusin viedä datan, johon voin sitten lennossa (mallikohtaisesti) tehdä lisämuuttujia (.SVO:ssa on muutenkin tuo 2 Gb datarajoitus...). Tuosta hahmotelmasta voi sit tehdä R:n funktion (funktio <- function() {}), niin voi tehdä helpommin eri lägejä L = 1,2,... Toivottavasti tuo meni nyt oikein... :) |
Ohessa toinen R:llä tehtävä pikku kikka, jolla saa paneelidataan merkin, kun yksilö vaihtuu toiseksi (jos yksilöiden havainnot ovat peräkkäin). Tässäkin säästyy for-luupin tekemiseltä...
DATA _K ID A A A GI GI C R2 R2 FILE COPY _K TO NEW K R CUR+1,END D <- read.svo("K.SVO"); D ### Vaihtokohta, jossa id muuttuu toiseksi ### siirretään vektoria yksi pykälä eteenpäin D$VAIHTO <- ifelse(D$ID!=c("EKAID",D$ID[-length(D$ID)]), 1,0); D$IDNRO <- cumsum(D$VAIHTO); D ID VAIHTO IDNRO 1 A 1 1 2 A 0 1 3 A 0 1 4 GI 1 2 5 GI 0 2 6 C 1 3 7 R2 1 4 8 R2 0 4 |
Minä olen tehnyt tuon saman yleensä jotenkin näin: DATA _K ID A A A GI GI C R2 R2 FILE COPY _K TO NEW K ................... VAR IDNRO:1(#)=1 TO K / SELECT=ORDER,1 VAR IDNRO=if(str(ID)=str(ID[-1])then(IDNRO[-1])else(IDNRO[-1]+1) TO K / SELECT=ORDER,2,9999999 FILE SHOW K :JVa |
Jeps, noinhan se menee "Survon" puolella. R:ssä tuo for-luuppi on isoilla datoilla niin hidas, että olen haeskellut vaihtoehtoisia tapoja... Petri |
Free forum by Nabble | Edit this page |