Come posso calcolare un CDF empirica in R?
-
29-09-2019 - |
Domanda
Sto leggendo un tavolo sparse da un file che assomiglia a:
1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1
Nota fila lunghezze sono diverse.
Ogni riga rappresenta una singola simulazione. Il valore nella colonna i-esima in ogni riga dice quante volte il valore di i-1 è stata osservata in questa simulazione. Ad esempio, nella prima simulazione (prima riga), abbiamo ottenuto un singolo risultato con il valore '0' (prima colonna), 7 risultati con valore '2' (terza colonna), ecc.
Vorrei creare una funzione di media di distribuzione cumulativa (CDF) per tutti i risultati della simulazione, così ho potuto poi usarlo per calcolare un valore di p empirica per veri risultati.
Per fare questo posso prima riassumere ogni colonna, ma ho bisogno di prendere zeri per le colonne undef.
Come faccio a leggere una tabella con diverse lunghezze di fila? Come posso riassumere colonne sostituendo 'indefinito' valori con 0' ? E infine, come faccio a creare il CDF? (Posso farlo manualmente, ma credo che ci sia qualche pacchetto che può farlo).
Soluzione
Questa leggerà i dati in:
dat <- textConnection("1 0 7 0 0 1 0 0 0 5 0 0 0 0 2 0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1
1 0 0 1 0 3 0 0 0 0 1 0 0 0 1
0 0 0 1 0 0 0 2 0 0 0 0 1 0 0 0 1 0 1 0 0 1 1 2 1 0 1 0 1")
df <- data.frame(scan(dat, fill = TRUE, what = as.list(rep(1, 29))))
names(df) <- paste("Val", 1:29)
close(dat)
Con conseguente:
> head(df)
Val 1 Val 2 Val 3 Val 4 Val 5 Val 6 Val 7 Val 8 Val 9 Val 10 Val 11 Val 12
1 1 0 7 0 0 1 0 0 0 5 0 0
2 1 0 0 1 0 0 0 3 0 0 0 0
3 0 0 0 1 0 0 0 2 0 0 0 0
4 1 0 0 1 0 3 0 0 0 0 1 0
5 0 0 0 1 0 0 0 2 0 0 0 0
....
Se i dati sono in un file, fornire il nome del file, invece di dat
. Questo codice presuppone che ci sono un massimo di 29 colonne, come per i dati da Lei forniti. Modificare il 29
per soddisfare i dati reali.
Otteniamo le somme delle colonne utilizzando
df.csum <- colSums(df, na.rm = TRUE)
la funzione ecdf()
genera l'ECDF si voleva,
df.ecdf <- ecdf(df.csum)
e possiamo tracciare utilizzando il metodo plot()
:
plot(df.ecdf, verticals = TRUE)
Altri suggerimenti
È possibile utilizzare la ecdf()
(nella base di R) o Ecdf()
(dal Hmisc funzioni del pacchetto).