Calcola la Media del Campione Autoescluso per Gruppo

Calcola la media del campione autoescluso per gruppo: egen (stata cmd) calcola una statistica riassuntiva per gruppi e la memorizza in una nuova variabile. Ad esempio, i dati hanno tre variabili, id, time e y, vogliamo calcolare la media di y per ogni id e quindi memorizzarla come nuova variabile mean_y.

In precedenza, il comando sarebbe

egen mean_y = mean (y), by (id)

In R, questo compito può essere completato da ave

Genera set di dati:

 

1
2
3
4
id <- rep(1:3,each=3)
t<-rep(1:3,3)
y<-sample(1:5,9,replace=T)
my_data<-data.frame(id=id,time=t,y=y)

Dati originali:

1
2
3
4
5
6
7
8
9
10
11
> my_data
  id time y
1  1    1 4
2  1    2 1
3  1    3 4
4  2    1 2
5  2    2 3
6  2    3 3
7  3    1 4
8  3    2 4
9  3    3 3
1
2
3
4
5
6
7
8
9
10
11
> within(my_data, {mean_y = ave(y,id)} )
  id time y   mean_y
1  1    1 4 3.000000
2  1    2 1 3.000000
3  1    3 4 3.000000
4  2    1 2 2.666667
5  2    2 3 2.666667
6  2    3 3 2.666667
7  3    1 4 3.666667
8  3    2 4 3.666667
9  3    3 3 3.666667

Le statistiche di riepilogo predefinite sono medie. Tuttavia, possiamo assegnare una funzione particolare per calcolare le statistiche di riepilogo. Ad esempio, se vogliamo calcolare la sd di y per id, allora possiamo avere

1
2
3
4
5
6
7
8
9
10
11
within(my_data, {sd_y = ave(y,id,FUN=sd)} )
  id time y      sd_y
1  1    1 4 1.7320508
2  1    2 1 1.7320508
3  1    3 4 1.7320508
4  2    1 2 0.5773503
5  2    2 3 0.5773503
6  2    3 3 0.5773503
7  3    1 4 0.5773503
8  3    2 4 0.5773503
9  3    3 3 0.5773503

Nota: l’interno valuta un’espressione in un ambiente creato da data.frame. Inoltre, modificherà data.frame e lo restituirà (nel nostro caso, crea nuove variabili, mean_y o sd_y)

Ecco un altro uso di ave. Vorremmo creare una media campionaria auto-esclusa per gruppo.

Supponiamo che i dati abbiano tre variabili, id, time e y, vogliamo calcolare la media di y per ogni id ma escludendo il valore di y del periodo di tempo corrente.

 

1
2
3
4
id <- rep(1:3,each=3)
t<-rep(1:3,3)
y<-sample(1:5,9,replace=T)
my_data<-data.frame(id=id,time=t,y=y)

Orignal data:

1
2
3
4
5
6
7
8
9
10
11
> my_data
  id time y
1  1    1 4
2  1    2 1
3  1    3 4
4  2    1 2
5  2    2 3
6  2    3 3
7  3    1 4
8  3    2 4
9  3    3 3

Innanzitutto, abbiamo bisogno di una funzione per calcolare la media auto esclusa. Questa funzione accetta un vettore e una funzione (il valore predefinito è media) come argomento. Applica la funzione al vettore in cui uno degli elementi viene rimosso. Il valore restituito è un vettore che i-esimo elemento è dato da FUN (x [-i])

1
2
3
4
5
6
7
8
9
excludeSelfSummary<-function(x,FUN=mean){
    sapply(1:length(x), function(i) FUN(x[-i]))
}
> excludeSelfSummary(1:5,mean)
[1] 3.50 3.25 3.00 2.75 2.50
> excludeSelfSummary(1:5,min)
[1] 2 1 1 1 1
> excludeSelfSummary(1:5,max)
[1] 5 5 5 5 4

Quindi passiamo il Riepilogo excludeSelf per salvare come argomento.

1
2
3
4
5
6
7
8
9
10
11
> within(my_data, {sd_y = ave(y,id,FUN=excludeSelfSummary)} )
  id time y sd_y
1  1    1 4  2.5
2  1    2 1  4.0
3  1    3 4  2.5
4  2    1 2  3.0
5  2    2 3  2.5
6  2    3 3  2.5
7  3    1 4  3.5
8  3    2 4  3.5
9  3    3 3  4.0

Ovviamente, potremmo calcolare il minimo o il massimo esclusi.

1
2
3
4
5
6
7
8
9
10
11
> within(my_data, {sd_y = ave(y,id,FUN=function(x) excludeSelfSummary(x,min) )})
  id time y sd_y
1  1    1 4    1
2  1    2 1    4
3  1    3 4    1
4  2    1 2    3
5  2    2 3    2
6  2    3 3    2
7  3    1 4    3
8  3    2 4    3
9  3    3 3    4

TszKin Julian Chan

 

Leave a Reply