Muuttujamuunnokset paneeliaineistoissa

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Muuttujamuunnokset paneeliaineistoissa

Petri Palmu
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... :)
Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset paneeliaineistoissa - id vaihdon merkintä

Petri Palmu
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



Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset paneeliaineistoissa - id vaihdon merkintä

Juha Valtonen


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
Reply | Threaded
Open this post in threaded view
|

Re: Muuttujamuunnokset paneeliaineistoissa - id vaihdon merkintä

Petri Palmu
Juha Valtonen wrote
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