Pergunta

Eu tenho o seguinte conjunto de dados que estou tentando plotar com GGPlot2, é uma série temporal de três experiências A1, B1 e C1 e cada experimento teve três repetições.

Estou tentando adicionar uma estatística que detecta e remove Outliers antes de devolver um mais suave (média e variação?). Eu escrevi minha própria função externa (não mostrada), mas espero que já exista uma função para fazer isso, eu simplesmente não a encontrei.

Eu olhei para stat_sum_df ("median_hilow", geom = "smoking") de alguns exemplos no livro GGPlot2, mas não entendi a ajuda do documento do hmisc para ver se ele remove ou não ou não.

Existe uma função para remover outliers como este no GGPlot ou onde eu alteraria meu código abaixo para adicionar minha própria função?

EDIT: Acabei de ver isso (Como usar testes externos no código R) e observe que Hadley recomenda o uso de um método robusto, como o RLM. Estou plotando curvas de crescimento bacteriano, por isso não acho que um modelo linear seja melhor, mas qualquer conselho sobre outros modelos ou usando ou usando modelos robustos nessa situação seria apreciado.

library (ggplot2)  

data = data.frame (day = c(1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7,1,3,5,7), od = 
c(
0.1,1.0,0.5,0.7
,0.13,0.33,0.54,0.76
,0.1,0.35,0.54,0.73
,1.3,1.5,1.75,1.7
,1.3,1.3,1.0,1.6
,1.7,1.6,1.75,1.7
,2.1,2.3,2.5,2.7
,2.5,2.6,2.6,2.8
,2.3,2.5,2.8,3.8), 
series_id = c(
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"A1", "A1", "A1","A1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"B1", "B1","B1", "B1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1",
"C1","C1", "C1", "C1"),
replicate = c(
"A1.1","A1.1","A1.1","A1.1",
"A1.2","A1.2","A1.2","A1.2",
"A1.3","A1.3","A1.3","A1.3",
"B1.1","B1.1","B1.1","B1.1",
"B1.2","B1.2","B1.2","B1.2",
"B1.3","B1.3","B1.3","B1.3",
"C1.1","C1.1","C1.1","C1.1",
"C1.2","C1.2","C1.2","C1.2",
"C1.3","C1.3","C1.3","C1.3"))

> data
   day   od series_id replicate
1    1 0.10        A1      A1.1
2    3 1.00        A1      A1.1
3    5 0.50        A1      A1.1
4    7 0.70        A1      A1.1
5    1 0.13        A1      A1.2
6    3 0.33        A1      A1.2
7    5 0.54        A1      A1.2
8    7 0.76        A1      A1.2
9    1 0.10        A1      A1.3
10   3 0.35        A1      A1.3
11   5 0.54        A1      A1.3
12   7 0.73        A1      A1.3
13   1 1.30        B1      B1.1
... etc...

É isso que tenho até agora e está funcionando bem, mas os valores extremos não são removidos:

r <- ggplot(data = data, aes(x = day, y = od))
r + geom_point(aes(group = replicate, color = series_id)) + # add points
   geom_line(aes(group = replicate, color = series_id)) + # add lines
   geom_smooth(aes(group = series_id))  # add smoother, average of each replicate

EDIT: Acabei de adicionar dois gráficos abaixo, mostrando exemplos dos problemas externos que estou tendo dos dados reais, em vez dos dados de exemplo acima.

A primeira plotha mostra a série P26S4 e, por volta do dia 32, algo realmente estranho continuou em duas das réplicas, mostrando 2 Outliers.

O segundo gráfico mostra a série P22S5 e no dia 18, algo estranho continuou com a leitura naquele dia, provavelmente o erro da máquina.

No momento, estou de olho nos dados, para verificar se as curvas de crescimento parecem boas. Depois de seguir o conselho de Hadley e definir a família = "simétrica", estou confiante de que o Loess Smoother faz um trabalho decente ao ignorar os outliers.

p26s4 shows around day 32 something really weird went on in two of the replicates, showing 2 outliers p22s5 shows that on day 18, something weird went on with the reading that day, likely machine error I think

@Peter/@Hadley, a próxima coisa que gostaria de fazer é tentar ajustar uma curva de crescimento logística, Gompertz ou Richard para esses dados, em vez de um Loess e calcular a taxa de crescimento no estágio exponencial. Eventualmente, pretendo usar o pacote grofit em r (http://cran.r-project.org/web/packages/grofit/index.html), mas por enquanto eu gostaria de plotá -los manualmente usando GGPlot2, se possível. Se você tiver alguma dica, seria muito apreciado.

Foi útil?

Solução

Você já tentou o family = "symmetric" argumento para geom_smooth (que, por sua vez, será transmitido para loess)? Isso tornará o Loess suave resistente a outliers.

No entanto, olhando para seus dados, por que você acha que um ajuste linear não é adequado? Você só tem 4 x valores, e certamente não parece haver fortes evidências para um afastamento da linearidade.

Outras dicas

Primeiro, não tenho certeza se um 'Outlier' é definido corretamente em dados tão pequenos.

Segundo, você teria que decidir o que você quer dizer com "Outlier", ou seja, é um dos medicamentos, uma das réplicas ou um dos momentos?

Como Hadley observa, há poucas evidências de desvio da linearidade.

Finalmente, acho que parte do ponto de usar um mais suave é que ele lida bem com outliers, desde que haja dados suficientes. Mas você tem muito pouco.

Então, eu tenho que perguntar exatamente por que você deseja remover outliers. Ou seja, o que você vai fazer com esses dados (além de fazer lotes legais)?

Eu espero que isso ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top