Pregunta

Estoy leyendo una tabla dispersa de un archivo que se parece 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 longitudes de fila son diferentes.

Cada fila representa una única simulación. El valor de la columna i-ésima en cada fila dice cuántas veces el valor i-1 se observó en esta simulación. Por ejemplo, en la primera simulación (primera fila), conseguimos un único resultado con el valor '0' (primera columna), 7 resultados con valor '2' (tercera columna) etc.

Deseo crear una función de distribución acumulativa promedio (CDF) para todos los resultados de la simulación, por lo que podría utilizarlo más adelante para calcular un valor de p empíricos para obtener resultados verdaderos.

Para hacer esto puedo resumir por primera vez cada columna, pero tengo que tener ceros para las columnas undef.

¿Cómo se lee una tabla de este tipo con diferentes longitudes de filas? ¿Cómo puedo resumir columnas reemplazando 'undef' con los valores 0' ? Y por último, ¿cómo puedo crear la CDF? (Puedo hacer esto manualmente, pero supongo que hay algún paquete que se puede hacer eso).

¿Fue útil?

Solución

Esto permitirá la lectura de los datos en:

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)

El resultado es:

> 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
....

Si los datos están en un archivo, proporcione el nombre de archivo en lugar de dat. Este código se supone que hay un máximo de 29 columnas, según los datos que ha proporcionado. Alterar el 29 para adaptarse a los datos reales.

Tenemos las sumas de las columnas utilizando

df.csum <- colSums(df, na.rm = TRUE)

la función ecdf() genera el ECDF que quería,

df.ecdf <- ecdf(df.csum)

y podemos trazar usando el método plot():

plot(df.ecdf, verticals = TRUE)

Otros consejos

Puede utilizar el ecdf() (en la base R) o Ecdf() (de la Hmisc paquete) funciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top