Last updated: 2021-05-24

Checks: 7 0

Knit directory: 2021/

This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20210412) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version 4233f46. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/

Untracked files:
    Untracked:  Curso_Bioestadistica_MTripp_cuatriII.docx
    Untracked:  Curso_Bioestadistica_MTripp_cuatriII.pdf
    Untracked:  Diapositivas/
    Untracked:  README.html
    Untracked:  Resources/
    Untracked:  analysis/images/
    Untracked:  data/Consumo_oxigeno_wide.csv
    Untracked:  data/Data_enzimas_Experimento1.txt
    Untracked:  data/Data_enzimas_Experimento2.txt
    Untracked:  data/Data_enzimas_Experimento3.txt
    Untracked:  data/Data_enzimas_Experimento4.txt
    Untracked:  data/DownloadFestival(No Outlier).dat
    Untracked:  data/Festival.csv
    Untracked:  data/RExam.dat
    Untracked:  data/Rexamendat.csv
    Untracked:  data/Tabla1_Muestreo.txt
    Untracked:  data/Transcriptome_Anotacion.csv
    Untracked:  data/Transcriptome_DGE.csv
    Untracked:  data/datasets_Pokemon.csv
    Untracked:  data/datasets_Pokemon.xls
    Untracked:  data/penguins_size.csv
    Untracked:  data/pokemon_extended.csv
    Untracked:  output/Plot_all_penguins.pdf
    Untracked:  output/Plot_all_penguins.tiff
    Untracked:  output/graficos/

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/Clase2_Data_Frames.Rmd) and HTML (docs/Clase2_Data_Frames.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
html 3d12902 Miguel Tripp 2021-05-16 Build site.
html 20b3aab Miguel Tripp 2021-05-16 Build site.
html f20dcb1 Miguel Tripp 2021-05-16 Build site.
html b1ca7f3 Miguel Tripp 2021-05-16 Build site.
html b3002cc Miguel Tripp 2021-05-04 Build site.
html 2c60db3 Miguel Tripp 2021-05-04 Build site.
html 65fa0ee Miguel Tripp 2021-05-04 Build site.
html b3c3d89 Miguel Tripp 2021-04-26 Build site.
html 195c2e9 Miguel Tripp 2021-04-25 Build site.
html e322dac Miguel Tripp 2021-04-25 Build site.
Rmd 7d0111c Miguel Tripp 2021-04-25 Publish the initial files for myproject
html b237a5e Miguel Tripp 2021-04-22 Build site.
Rmd cd132b5 Miguel Tripp 2021-04-22 Publish the initial files for myproject
html 4c3c22d Miguel Tripp 2021-04-20 Build site.
Rmd 43a6b26 Miguel Tripp 2021-04-20 Publish the initial files for myproject
html 945bc0f Miguel Tripp 2021-04-18 Build site.
html 527e486 Miguel Tripp 2021-04-18 Build site.
html cddaa8a Miguel Tripp 2021-04-18 Build site.
html 02e6728 Miguel Tripp 2021-04-18 Build site.
html 2af07d8 Miguel Tripp 2021-04-18 Build site.
Rmd f24eb8f Miguel Tripp 2021-04-18 Publish the initial files for myproject

1 Data Frames

Los data frames son estructuras de datos de dos dimensiones que pueden contener datos de diferentes tipos, por lo tanto, son heterogeneas. En terminos generales, los renglones de una data.frame representan casos, individuos u observaciones, mientras que las columnas contiene datos de un solo tipo.

1.1 Creación de data frames

Genera un data.frame con los siguientes elementos:

Nombre <- c("Alex", "Lilly", "Mark", "Oliver", "Martha", "Lucas", "Caroline")
Edad <- c(25, 31, 23, 52, 76, 49, 26)
Altura <- c(177, 163, 190, 179, 163, 183, 164)
Peso <- c(57, 69, 83, 75, 70, 83, 53)
Sexo <- as.factor(c("M", "M", "H", "H", "M", "H", "M"))

df <- data.frame (row.names = Nombre, Edad, Altura, Peso, Sexo)

Esto nos produce la tabla

df
         Edad Altura Peso Sexo
Alex       25    177   57    M
Lilly      31    163   69    M
Mark       23    190   83    H
Oliver     52    179   75    H
Martha     76    163   70    M
Lucas      49    183   83    H
Caroline   26    164   53    M

Acceder a las variables del data.frame:

  • Utilizando el symbolo $.

  • Utilizando indices [F, C].

para obtener los pesos:

df$Peso
[1] 57 69 83 75 70 83 53

Para obtener las edades

df[,2]
[1] 177 163 190 179 163 183 164

Otra opción:

df[, "Edad"]
[1] 25 31 23 52 76 49 26

Ejercicio: ¿como puedo acceder a toda la información de Mark?

df["Mark",]
     Edad Altura Peso Sexo
Mark   23    190   83    H

*Para que esto funcione, nuestra tabla tiene que tener colnames y rownames

Ahora, deseamos agregar una columna trabajo con la siguiente información

Nombre Trabaja
Alex si
Lilly no
Mark no
Oliver si
Martha si
Lucas no
Caroline si

En la clase anterior, vimos que se puede agregar una columna nueva usando el operador $.

Otra forma de agregar elementos nuevos a una tabla es mediante el uso de cbind y rbind.

Trabajo <- c("si","no","no","si","si","no","si")

df2 <- data.frame(row.names  = Nombre,Trabajo) 

df2

Ahora añade esta nueva columna a df.

  1. ¿Cuantas filas y columnas tiene la tiene tabla?
  2. ¿Que tipod de dato (clase) esta en cada columna
df_bind <- cbind(df, df2)

Verificar las dimensiones de la tabla con dim()

dim(df)
[1] 7 4
dim(df2)
[1] 7 1
dim(df_bind)
[1] 7 5

2 Matrices y arreglos

Las matrices y arrays pueden ser definidos como vectores multidimencionales. Especificamente las matrices poseen dos dimensiones y unicamente pueden contener datos de un solo tipo.

2.1 Creación de matrices

Para crear una matriz se usa la función matrix(), la cual usa los argumentos nrow y ncol. Con ellos se especifica el número de renglones y columnas que tendrá nuestra matriz.

#matriz sin especificar renglones ni columnas
matrix(1:12)
      [,1]
 [1,]    1
 [2,]    2
 [3,]    3
 [4,]    4
 [5,]    5
 [6,]    6
 [7,]    7
 [8,]    8
 [9,]    9
[10,]   10
[11,]   11
[12,]   12

Ahora usamos la misma serie de números pero definiendo 3 filas y 4 columnas

matrix(1:12, nrow = 3, ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

Ahora usando la misma serie de números pero con 4 filas y 3 columnas

matrix(1:12, nrow = 4, ncol = 3)
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
  1. ¿Que pasa si definimos un menor número de filas y columnas que el número de elementos?
  2. ¿Que pasa si usamos un número mayor de filas y columnas que el número total de elementos

Al igual que como lo vimos con las data frame, es posible unir vectores con las funciones:

  • cbind()
  • rbind()

De este modo podemos generar una matriz a partir de varios vectores

vec1 <- 1:4
vec2 <- 5:8
vec3 <- 9:12
vec4 <- 13:16

Ahora une los vectores usando rbind y cbind. ¿cual es la diferencia?

Genera los siguientes vectores:

vec1 <- 1:2
vec2 <- 1:3
vec3 <- 1:5

Trata de unir los vectores como en el ejercicio anterior. ¿cual es la diferencia?

2.2 Convertir matrices a data frames y viceversa

Para convertir una matriz a data frame, se usa la función as.data.frame() mientras que para el caso contrario se usa as.matrix(). Es importante tomar en cuenta la naturaleza de cada estructura: las matrices solo aceptan un solo tipo de dato

Por ejeplo, tenemos la matriz:

matriz <- matrix(1:12, 3,4)
matriz
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

se convierte a data.frame

matriz_df <- as.data.frame(matriz)
matriz_df
  V1 V2 V3 V4
1  1  4  7 10
2  2  5  8 11
3  3  6  9 12

Ahora trataremos de convertir la tabla df_bind a una matriz.

df_matriz <- as.matrix(df_bind)
df_matriz
         Edad Altura Peso Sexo Trabajo
Alex     "25" "177"  "57" "M"  "si"   
Lilly    "31" "163"  "69" "M"  "no"   
Mark     "23" "190"  "83" "H"  "no"   
Oliver   "52" "179"  "75" "H"  "si"   
Martha   "76" "163"  "70" "M"  "si"   
Lucas    "49" "183"  "83" "H"  "no"   
Caroline "26" "164"  "53" "M"  "si"   
  • ¿que tipo de dato contiene la matriz?

  • ¿como podemos generar una matriz solamente con datos númericos?

2.3 Arreglos

son similares a las matrices pero pueden contener 2 o mas dimensiones

arreglo <- array(1:24, dim = c(2,3,4))
arreglo
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

3 Factores

Regresando a nuestra tabla df_bind, despliega la columna de "Sexo:

df_bind$Sexo
[1] M M H H M H M
Levels: H M

Los factores, son vectores que contienen información categorica la cual es de utilidad para agrupar los valores de la data frame.


Nota Para hacer cambios puntuales a una tabla se puede usar la función fix().


4 Flujo de trabajo: rutas relativas y absolutas

R posee el poderoso concepto de directorio de trabajo (working directory en inglés). Aquí es donde R busca los archivos que le pides que lea y donde colocará todos los archivos que le pidas que guarde. RStudio muestra tu directorio de trabajo actual en la parte superior de la consola.

Puedes imprimir esto en código de R ejecutando el comando getwd() (en inglés get working directory, que significa obtener directorio de trabajo):

getwd()

Pero también es posible definir el directorio de trabajo desde R:

setwd("data/")

Ahora, nuuestro directorio de trabajo es ~/data, por lo que cualquier cosa que guardemos, se hara en este directorio.

Ahora regresemos a nuestro directorio principal y lo definimos nuevamente como nuestro directorio de trabajo; esto tambien se puede realizar directamente desde la ventana de Rstudio en more: Set as working directory.

5 Uso de projecto en Rstudio

Usar proeyectos dentro de Rstudio soluciona el problema de rutas “fragiles”. Cuando estas trabajando dentro de un projecto (.Rproj), el directorio de trabajo corresponde al directorio raiz.

6 Importar un archivo de texto

La forma mas sencilla de transferir datos hacia R es mediante un archivo sin formato (plain text). Estos puede ser:

  • Archivos separados por comma (.csv)
  • Archivos separados por tabulación (.txt)
  • Data iterchange format (.dif)

Estos tipos de archivos son de gran utilidad ya que pueden ser leidos por na gran variedad de bases y paquetes estadisticos.

Para importar una base de datos a R se pueden utilizar la funcion read.table().

A continuación vamos a abrir un archivo de texto que esta dentro de la carpeta data

tabla <- read.table("data/Tabla1_Muestreo.txt", sep = "\t", header = TRUE)

Exploracdión general de los datos

usar la funcion head() o tail para tener una visualización de los datos

head(tabla)
  Individuo        Sitio Estacion Sexo Profundidad Longitud_mm
1         1 Bahia La Paz   Verano    H  Superficie       30.27
2         2 Bahia La Paz   Verano    M  Superficie       35.50
3         3 Bahia La Paz   Verano    H  Superficie       30.36
4         4 Bahia La Paz   Verano    H  Superficie       24.86
5         5 Bahia La Paz   Verano    M  Superficie       31.81
6         6 Bahia La Paz   Verano    H  Superficie       29.51
tail(tabla)
    Individuo        Sitio Estacion Sexo Profundidad Longitud_mm
139       139 Todos Santos Invierno    H       Fondo       16.12
140       140 Todos Santos Invierno    H       Fondo       30.14
141       141 Todos Santos Invierno    H       Fondo        6.20
142       142 Todos Santos Invierno    H       Fondo       23.01
143       143 Todos Santos Invierno    H       Fondo       19.09
144       144 Todos Santos Invierno    M       Fondo       18.12

Podemos ver la estructura de la tabla con la función str()

str(tabla)
'data.frame':   144 obs. of  6 variables:
 $ Individuo  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Sitio      : chr  "Bahia La Paz" "Bahia La Paz" "Bahia La Paz" "Bahia La Paz" ...
 $ Estacion   : chr  "Verano" "Verano" "Verano" "Verano" ...
 $ Sexo       : chr  "H" "M" "H" "H" ...
 $ Profundidad: chr  "Superficie" "Superficie" "Superficie" "Superficie" ...
 $ Longitud_mm: num  30.3 35.5 30.4 24.9 31.8 ...

Ademas podemos ver el resumen general de los datos con summary()

summary(tabla)
   Individuo         Sitio             Estacion             Sexo          
 Min.   :  1.00   Length:144         Length:144         Length:144        
 1st Qu.: 36.75   Class :character   Class :character   Class :character  
 Median : 72.50   Mode  :character   Mode  :character   Mode  :character  
 Mean   : 72.50                                                           
 3rd Qu.:108.25                                                           
 Max.   :144.00                                                           
 Profundidad         Longitud_mm   
 Length:144         Min.   : 6.20  
 Class :character   1st Qu.:21.45  
 Mode  :character   Median :29.43  
                    Mean   :28.97  
                    3rd Qu.:35.89  
                    Max.   :56.93  

Ejercicio: Usando lo que vimos en la lección pasada: (1) calcula la longitud promedio de todas las estaciones. (2) crea un nuevo vector que contenga solamente las longitudes con el nombre de cada individuo.

Tambien es posible usar read.table o read.csv para abrir datos remotos usando la URL

url <- "https://raw.githubusercontent.com/trippv/Miguel_Tripp/master/Datos_metabolitos.csv"

metabolitos <- read.csv(url)

head(metabolitos)
  ID  Lipidos Carbohidratos Proteinas    Valina   Leucina Isoleucina
1  1 5.136842      5.421053 187.46842 0.6815789  9.634211   8.197368
2  2 3.592593      3.651852 224.55185 0.4703704  9.448148   6.777778
3  3 2.383673      4.306122 142.19796 0.7040816  6.228571   4.553061
4  4 7.003571      8.196429 479.80357 0.5964286 16.857143  16.450000
5  5 1.132143      2.407143  98.78571 0.4000000  5.946429   3.514286
6  6 3.268182      9.154545 408.42727 1.8818182  9.836364  13.377273

7 Filtrar o rearreglar variables

7.1 Función subset()

Cuando se tiene un set de datos bastante grande, resulta conveniente remover o filtrar aquellas variables innecesarias y arreglar el restos de las variables de manera práctica.

La función subset() permite seleccionar un subset de datos que cumplen determinadas condiciones, mientras que select permite definir cuales variables mantener.

De nuetra tabla, vamos a generar una nueva tabla que contenga solamente los individuos, sitios y longitudes.

tabla1 <- subset(tabla, select=c(Individuo, Sitio, Longitud_mm))

Ahora vamos a generar una nueva tabla que contenga solamente los individuos de verano

tabla_verano <- subset(tabla, Estacion == "Verano")
head(tabla_verano)
  Individuo        Sitio Estacion Sexo Profundidad Longitud_mm
1         1 Bahia La Paz   Verano    H  Superficie       30.27
2         2 Bahia La Paz   Verano    M  Superficie       35.50
3         3 Bahia La Paz   Verano    H  Superficie       30.36
4         4 Bahia La Paz   Verano    H  Superficie       24.86
5         5 Bahia La Paz   Verano    M  Superficie       31.81
6         6 Bahia La Paz   Verano    H  Superficie       29.51

Ejercicio: Crea una nueva tabla que contenga (1) solamente los organismos de superfice, (2) los individuos que tengan una longitud mayor al promedio total. ¿Cuantos individuos tienen una longitud mayor al promedio total?

Es posible seleccionar varios parametros simultaneamente usando el simbolor &.

Por ejemplo: seleccionar a los individuos de superficie y verano

tabla_sup_ver <- subset(tabla, Estacion == "Verano" & Profundidad == "Superficie")
head(tabla_sup_ver)
  Individuo        Sitio Estacion Sexo Profundidad Longitud_mm
1         1 Bahia La Paz   Verano    H  Superficie       30.27
2         2 Bahia La Paz   Verano    M  Superficie       35.50
3         3 Bahia La Paz   Verano    H  Superficie       30.36
4         4 Bahia La Paz   Verano    H  Superficie       24.86
5         5 Bahia La Paz   Verano    M  Superficie       31.81
6         6 Bahia La Paz   Verano    H  Superficie       29.51

Ejercicio: Crea una nueva tabla que contenga los individuos que NO sean de Bahia de La Paz y que tengan una longitud mayor o igual a 20 mm.

7.2 Indices

Tambien es posible generar subsets de datos usando indicies []. Recuerda que se aplica es mismo principio [filas, columnas].

Ahora queremos recrear la tabla tabla_verano. Primero verificamos cuales individuos tienen la etiqueta “Verano”:

tabla$Estacion == "Verano"
  [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [49]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [97]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[109]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Esto nos genera un vector con las filas que contienen la etiqueta (TRUE), con lo que podemos usar [] para fitrar las filas TRUE con todas las columnas

tabla_verano2 <- tabla[tabla$Estacion=="Verano", ]
head(tabla_verano2)
  Individuo        Sitio Estacion Sexo Profundidad Longitud_mm
1         1 Bahia La Paz   Verano    H  Superficie       30.27
2         2 Bahia La Paz   Verano    M  Superficie       35.50
3         3 Bahia La Paz   Verano    H  Superficie       30.36
4         4 Bahia La Paz   Verano    H  Superficie       24.86
5         5 Bahia La Paz   Verano    M  Superficie       31.81
6         6 Bahia La Paz   Verano    H  Superficie       29.51

Ejercicio Utilizando indices, genera un vector solamente con los valores de longitud de los indivuos de verano. Agrega las etiquetas de individuos

Ejercicio (1) ¿Cual individuo tiene la mayor longitud?. (2)¿Cuantos individuos tienen una longitud igual o menor al promedio total?. (3) ¿Cual es el la longitud promedio de los Individuos de Verano?

8 Exportar una base de datos

Pära exportar un tabla, por ejemplo nuestro objeto tabla_verano2 se usa la funcion write.table()

write.table(tabla_verano2, "Tabla_subset-verano.txt", sep = "\t", row.names = FALSE)

9 Ejercicio

Dentro de tu projecto, en la carpeta datahay cuatro archivos los cuales contienen los resultados de la actividad enzimatica de la lactado deshidrogenasa (LDH), citrato sintqasa (CS) y tauropina deshidrogenasa (TDH). Estas enzimas se analizaron en cuatro experimentos diferentes (Experimento1, Experimento2, Experimento3 y Experimento4).

Usando lo que hemos visto hasta ahora, realiza lo siguiente

  1. Importa cada archivo como data.frame
  2. Une todas los data frames en uno solo,
  3. Filtra todas las mediciones con Meas_Temp igual a 18°C
  4. Para cada enzima, genera un subconjunto preservando solamente las columnas ExpNum TreatTemp, y la actividad correspondiente a cada enzima Activityxxx
  5. Dentro de la carpeta deoutputCrea un nuevo directorio de trabajo llamado datos_enzimas y guarda cada subconjunto como archivo separado por comas csv.

sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19041)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] workflowr_1.6.2

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.5        whisker_0.4       knitr_1.30        magrittr_2.0.1   
 [5] R6_2.5.0          rlang_0.4.11      fansi_0.4.2       stringr_1.4.0    
 [9] tools_4.0.5       xfun_0.20         utf8_1.2.1        git2r_0.27.1     
[13] htmltools_0.5.1.1 ellipsis_0.3.1    rprojroot_2.0.2   yaml_2.2.1       
[17] digest_0.6.27     tibble_3.0.4      lifecycle_1.0.0   crayon_1.4.1     
[21] later_1.1.0.1     vctrs_0.3.8       promises_1.1.1    fs_1.5.0         
[25] glue_1.4.2        evaluate_0.14     rmarkdown_2.6     stringi_1.5.3    
[29] compiler_4.0.5    pillar_1.6.0      httpuv_1.5.4      pkgconfig_2.0.3