Prática Guiada

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 é:

  1. Organizar esses dados complexos de forma estruturada.

  2. Processar cada conjunto de dados experimental de forma padronizada.

  3. Identificar experimentos onde a resposta média foi acima de um determinado limiar.

  4. 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 1
exp1 <- 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 2
exp2 <- 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 3
exp3 <- 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édia
limiar_sucesso <- 14.5

# Função para analisar um único experimento
analisar_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 limiar
  if (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 experimento
cat("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 in names(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 tela
  cat(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!
-----------------------------------