2015-06-22 22 views
6

Ho appena trovato un file .do che devo tradurre in R perché non ho una licenza Stata; il mio Stata è arrugginito, quindi qualcuno può confermare che il codice sta facendo quello che penso sia?Conversione da Stata a R: collaudo

Per la riproducibilità, ho intenzione di tradurlo in un set di dati che ho trovato online, in particolare lo Milk Production dataset (p004) che fa parte di un libro di testo di Chatterjee, Hadi e Price.

Ecco il codice Stata:

collapse (min) min_protein = protein /// 
     (mean) avg_protein = protein /// 
     (median) median_protein = protein /// 
     (sd) sd_protein = protein /// 
     if protein > 2.8, by(lactatio) 

Ecco cosa penso che sta facendo in data.table sintassi:

library(data.table) 
library(foreign) 
DT = read.dta("p004.dta") 
setDT(DT) 

DT[protein > 2.8, 
    .(min_protein = min(protein), 
    avg_protein = mean(protein), 
    median_protein = median(protein), 
    sd_protein = sd(protein)), 
    keyby = lactatio] 

# lactatio min_protein avg_protein median_protein sd_protein 
# 1:  1   2.9 3.162632   3.10 0.2180803 
# 2:  2   2.9 3.304688   3.25 0.2858736 
# 3:  3   2.9 3.371429   3.35 0.4547672 
# 4:  4   2.9 3.231250   3.20 0.3419917 
# 5:  5   2.9 3.855556   3.20 1.9086061 
# 6:  6   3.0 3.200000   3.10 0.2645751 
# 7:  7   3.3 3.650000   3.65 0.4949748 
# 8:  8   3.2 3.300000   3.30 0.1414214 

E 'corretto?

Questo sarebbe facile per confermare se avevo usato Stata negli ultimi 18 mesi o se avessi una copia installata - sperando di poter piegare l'orecchio di qualcuno per il quale uno di questi è vero. Grazie.

+0

Nota che puoi sempre accedere ai file della guida di Stata (_e.g._, [collapse] (http://www.stata.com/help.cgi?collapse)) online, nel caso in cui questo aiuti a chiarire il codice. –

+0

sì, l'ho letto, ed è per questo che penso che il codice 'R' che ho fornito sia giusto. Spero solo di avere qualche conferma da parte di chiunque conosca entrambe le lingue abbastanza bene. – MichaelChirico

+0

100% corretto. Ma se fornisci i dati di esempio, posso riprodurre l'output. – user227710

risposta

1

L'intuizione è corretta. collapse è l'equivalente Stata della funzione R aggregate, che produce un nuovo set di dati da un set di dati di input applicando una funzione di aggregazione (o più funzioni di aggregazione, una per variabile) a ogni variabile in un set di dati.

ecco l'output per quel comando Stata sull'esempio set di dati:

. list 

    +------------------------------------------------------+ 
    | lactatio min_pr~n avg_pr~n median~n sd_pro~n | 
    |------------------------------------------------------| 
    1. |  1  2.9 3.162632  3.1 .2180803 | 
    2. |  2  2.9 3.304688  3.25 .2858736 | 
    3. |  3  2.9 3.371429  3.35 .4547672 | 
    4. |  4  2.9 3.23125  3.2 .3419917 | 
    5. |  5  2.9 3.855556  3.2 1.908606 | 
    |------------------------------------------------------| 
    6. |  6   3  3.2  3.1 .2645752 | 
    7. |  7  3.3  3.65  3.65 .4949748 | 
    8. |  8  3.2  3.3  3.3 .1414214 | 
    +------------------------------------------------------+ 
+1

Il crollo di Stata ti permette di creare più aggregati contemporaneamente, mentre l'aggregato di R ne dà solo uno (per quanto ne so). Sembra che l'operazione data.table dell'OP (o simile in dplyr) sia un analogo molto migliore. – Frank

+0

@Frank Sì e no. Data.table pensa che ognuno di essi sia coperto da diversi comandi Stata (ad esempio, 'drop',' keep', 'collapse',' unisci', 'expand',' reshape', ecc.). L'analogo più diretto è 'aggregato', anche se' aggregate' e 'collapse' funzionano in modo leggermente diverso. L'argomento 'FUN' per' aggregare' significa che puoi specificare le funzioni di aggregazione specifiche della classe, quindi sarebbe fattibile (se verboso) produrre identiche funzionalità usando 'aggregato'. – Thomas

+0

Hm, beh, non sono d'accordo, come non ho mai visto 'aggregato' usato in quel modo; e 'by' (e una mezza dozzina di altre funzioni) potrebbe probabilmente fare la stessa cosa con una contorsione sufficiente. Non mi riferivo a ciò che data.table fa in generale, ma la sintassi sopra, dove assume la forma '. (Newx = f (x), newy = g (y), newz = h (z)), by = id' che è il più vicino alla sintassi Stata come si può ottenere in R. – Frank

4

Ecco l'output Stata per i dati campione che è identico al data.table uscita:

collapse (min) min_protein = protein /// 
     (mean) avg_protein = protein /// 
     (median) median_protein = protein /// 
     (sd) sd_protein = protein /// 
     if protein > 2.8, by(lactatio) 

    lactatio min_protein avg_protein median_protein sd_protein 
    1 2.9 3.162632 3.1 0.2180803 
    2 2.9 3.304688 3.25 0.2858736 
    3 2.9 3.371429 3.35 0.4547672 
    4 2.9 3.23125  3.2 0.3419917 
    5 2.9 3.855556 3.2 1.908606 
    6 3 3.2   3.1 0.2645752 
    7 3.3 3.65  3.65 0.4949748 
    8 3.2 3.3   3.3 0.1414214 

e qui è l'output data.table (solo per essere sicuro di utilizzare i dati corretti)

library(foreign) #reading Stata data 
    data<-read.dta("p004.dta") 
    setkey(setDT(data),lactatio) 
    setDT(data)[protein>2.8, 
        .(min_protein=min(protein), 
        avg_protein=mean(protein), 
        median_protein=median(protein), 
        sd_protein=sd(protein)), 
        by=lactatio] 

    lactatio min_protein avg_protein median_protein sd_protein 
1:  1   2.9 3.162632   3.10 0.2180803 
2:  2   2.9 3.304688   3.25 0.2858736 
3:  3   2.9 3.371429   3.35 0.4547672 
4:  4   2.9 3.231250   3.20 0.3419917 
5:  5   2.9 3.855556   3.20 1.9086061 
6:  6   3.0 3.200000   3.10 0.2645751 
7:  7   3.3 3.650000   3.65 0.4949748 
8:  8   3.2 3.300000   3.30 0.1414214 
>