Prática Guaida: Analisando Resultados de Múltiplos Experimentos com R
Imagine que você está trabalhando em um laboratório de pesquisa e acabou de conduzir uma série de experimentos. Cada experimento gerou um conjunto de dados único, mas você precisa processar todos eles de uma forma padronizada, identificar padrões e gerar um resumo para o seu chefe.
O Desafio:
Você realizou três experimentos diferentes para testar a eficácia de um novo composto em células. Cada experimento gerou:
Um ID único para o experimento.
A data em que foi realizado.
Uma lista de amostras tratadas com o composto e suas respectivas respostas (ex: crescimento celular, expressão de gene). Essa resposta é um valor numérico.
Uma observação geral sobre o experimento (texto livre).
Seu objetivo é:
Organizar esses dados complexos de forma estruturada.
Processar cada conjunto de dados experimental de forma padronizada.
Identificar experimentos onde a resposta média foi acima de um determinado limiar.
Gerar um relatório simplificado para cada experimento.
Vamos ver como as listas, funções e laços trabalham juntos para resolver esse desafio!
Passo 1: Organizando os Dados com Listas (A “Pasta” de Cada Experimento)
Vamos começar criando uma lista para cada experimento. Cada lista vai conter o ID, a data, a tabela de resultados das amostras e a observação. Depois, agruparemos essas listas em uma lista “mestra”.
# Dados do Experimento 1exp1 <-list(id ="EXP001",data ="2024-06-10",resultados =data.frame(amostra =c("Amostra_T_01", "Amostra_T_02", "Amostra_T_03", "Amostra_C_01"),tratamento =c("Composto X", "Composto X", "Composto X", "Controle"),resposta =c(15.2, 16.1, 14.9, 10.5) # Resposta numérica (ex: unidades de fluorescência) ),observacao ="Crescimento celular observado. Sem contaminação aparente.")# Dados do Experimento 2exp2 <-list(id ="EXP002",data ="2024-06-12",resultados =data.frame(amostra =c("Amostra_T_01", "Amostra_T_02", "Amostra_C_01"),tratamento =c("Composto X", "Composto X", "Controle"),resposta =c(11.0, 10.5, 9.8) ),observacao ="Resposta abaixo do esperado. Possível erro na diluição.")# Dados do Experimento 3exp3 <-list(id ="EXP003",data ="2024-06-15",resultados =data.frame(amostra =c("Amostra_T_01", "Amostra_T_02", "Amostra_T_03", "Amostra_T_04", "Amostra_C_01"),tratamento =c("Composto X", "Composto X", "Composto X", "Composto X", "Controle"),resposta =c(18.0, 17.5, 19.1, 18.8, 11.2) ),observacao ="Excelente resposta, superando o experimento 1.")# Agrupando todos os experimentos em uma única lista "mestra"todos_experimentos <-list(experimento_1 = exp1,experimento_2 = exp2,experimento_3 = exp3)# Olhando a estrutura da nossa "pasta de experimentos"str(todos_experimentos, max.level =2) # max.level para não imprimir TUDO!
List of 3
$ experimento_1:List of 4
..$ id : chr "EXP001"
..$ data : chr "2024-06-10"
..$ resultados:'data.frame': 4 obs. of 3 variables:
..$ observacao: chr "Crescimento celular observado. Sem contaminação aparente."
$ experimento_2:List of 4
..$ id : chr "EXP002"
..$ data : chr "2024-06-12"
..$ resultados:'data.frame': 3 obs. of 3 variables:
..$ observacao: chr "Resposta abaixo do esperado. Possível erro na diluição."
$ experimento_3:List of 4
..$ id : chr "EXP003"
..$ data : chr "2024-06-15"
..$ resultados:'data.frame': 5 obs. of 3 variables:
..$ observacao: chr "Excelente resposta, superando o experimento 1."
Passo 2: Criando uma Função para Análise Padronizada (Sua “Ferramenta” para Avaliar)
Agora, precisamos analisar cada experimento de forma similar. Vamos criar uma função que receba os dados de um único experimento e faça alguns cálculos e verificações.
Queremos que essa função:
Calcule a resposta média das amostras tratadas (ignorando o controle, por exemplo).
Verifique se essa média está acima de um limiar de sucesso (definido por nós).
Retorne um resumo textual sobre o experimento.
# Definindo o limiar de sucesso para a resposta médialimiar_sucesso <-14.5# Função para analisar um único experimentoanalisar_experimento <-function(dados_experimento, limiar) {# Acessando o ID do experimento id_exp <- dados_experimento$id# Acessando a tabela de resultados e filtrando apenas as amostras tratadas# Usamos [ ] para filtrar linhas (aqui, onde tratamento não é "Controle")# e , ] para selecionar todas as colunas. resultados_tratados <- dados_experimento$resultados[dados_experimento$resultados$tratamento !="Controle", ]# Calculando a resposta média das amostras tratadas media_resposta <-mean(resultados_tratados$resposta)# Verificando se a resposta média está acima do limiarif (media_resposta > limiar) { status_sucesso <-"SUCESSO: Resposta média acima do limiar!" } else { status_sucesso <-"FALHA: Resposta média abaixo ou igual ao limiar." }# Criando um resumo textual resumo <-paste0("--- Análise do Experimento ", id_exp, " ---\n","Data: ", dados_experimento$data, "\n","Observação: ", dados_experimento$observacao, "\n","Média de Resposta (Amostras Tratadas): ", round(media_resposta, 2), "\n","Status: ", status_sucesso, "\n","-----------------------------------\n" )return(resumo)}# Testando a função com um único experimento (Exp1)cat(analisar_experimento(exp1, limiar_sucesso))
--- Análise do Experimento EXP001 ---
Data: 2024-06-10
Observação: Crescimento celular observado. Sem contaminação aparente.
Média de Resposta (Amostras Tratadas): 15.4
Status: SUCESSO: Resposta média acima do limiar!
-----------------------------------
Passo 3: Processando Múltiplos Experimentos com Laços (Seu “Robô” de Análise)
Agora que temos nossos dados organizados em uma lista de listas e uma função para analisar um único experimento, como aplicamos essa função a todos os experimentos de uma vez, sem ter que chamar a função para cada um? Com um laço for!
# Usando um laço 'for' para aplicar a função de análise a cada experimentocat("Relatórios Gerados para Todos os Experimentos:\n")
Relatórios Gerados para Todos os Experimentos:
# O laço irá iterar sobre cada sub-lista dentro de 'todos_experimentos'for (nome_experimento innames(todos_experimentos)) {# Acessamos os dados do experimento atual usando o nome dados_do_experimento_atual <- todos_experimentos[[nome_experimento]]# Chamamos nossa função 'analisar_experimento' para processar esses dados relatorio_gerado <-analisar_experimento(dados_do_experimento_atual, limiar_sucesso)# Imprimimos o relatório na telacat(relatorio_gerado)}
--- Análise do Experimento EXP001 ---
Data: 2024-06-10
Observação: Crescimento celular observado. Sem contaminação aparente.
Média de Resposta (Amostras Tratadas): 15.4
Status: SUCESSO: Resposta média acima do limiar!
-----------------------------------
--- Análise do Experimento EXP002 ---
Data: 2024-06-12
Observação: Resposta abaixo do esperado. Possível erro na diluição.
Média de Resposta (Amostras Tratadas): 10.75
Status: FALHA: Resposta média abaixo ou igual ao limiar.
-----------------------------------
--- Análise do Experimento EXP003 ---
Data: 2024-06-15
Observação: Excelente resposta, superando o experimento 1.
Média de Resposta (Amostras Tratadas): 18.35
Status: SUCESSO: Resposta média acima do limiar!
-----------------------------------