Criando regiões destacadas no R

May 12, 2005
By

This post was kindly contributed by fernandohrosa.com.br » R - go there to comment and to read the full post.

Algumas vezes, para fins didáticos ou ilustrativos, queremos destacar regiões em um gráfico de densidade, para mostrar por exemplo um p-valor ou uma região sobre a curva de uma normal.

Utilizando a função polygon() do R conseguimos produzir figuras como a abaixo:

Densidade padrão. Região destacada ilustra P(1 < X < 2)

Como fazer

Em primeiro lugar devemos fazer o gráfico da função ou densidade sob a qual queremos destacar a região. Em geral podemos fazer isso através da função curve(). Para o caso de uma normal padrão, podemos usar:

?View Code RSPLUS
1
curve(dnorm(x,0,1))

Feita a curva usaremos agora a função polygon(x,y). Os dois parâmetros principais dessa função, x e y definem o seu comportamento. Essa função desenha um polígono na tela, cujos vértices (xi,yi) são dados pelos elementos (x[i],y[i]) dos vetores x e y. O truque agora consiste em expressar a região que queremos destacar através de um polígono. A princípio a idéia parece estúpida, pois em geral nossa região vai ser sobre uma curva contínua, entretanto se tomarmos um polígono com número suficientes de lados a aproximação vai ser bem razoável.

Digamos que queiramos destacar a região compreendida por P(-3 < X < -2). O primeiro vértice do polígono que queremos usar para aproximar essa região será (-3,0). Colocamos então:

?View Code RSPLUS
1
2
cord.x <- c(-3) 
cord.y <- c(0)

O segundo vértice deverá ficar no ponto (-3,f(-3)), onde f(-3) é o valor da densidade da normal no ponto -3. No R podemos obter esse segundo valor através da função dnorm():

?View Code RSPLUS
1
2
cord.x <- c(cord.x,-3) <br />
cord.y <- c(cord.y,dnorm(-3))

Numa tentativa de aproximação por um trapezóide, podemos usar como terceiro vértice o ponto (-2,f(-2)), e como último o ponto (-2,0). Temos assim:

?View Code RSPLUS
1
2
cord.x <- c(cord.x,-2,-2) <br />
cord.y <- c(cord.y,dnorm(-2),0)

Obtemos então o polígono através do comando:

?View Code RSPLUS
1
polygon(cord.x,cord.y,col='skyblue')

Se você seguiu as instruções até aqui terá obtido o gráfico abaixo:

Primeira tentativa de criar uma área hachurada

Nada mal, mas podemos melhorar. O truque está em fazer uma seqüência de vértices entre os dois extremos na densidade (f(-3) e f(-2) no caso), de forma que o número grande de vértices nos dê uma aproximação melhor. Para isso, usamos a função seq(), para criar uma seqüencia entre -3 e -2 com intervalos de 0.01:

?View Code RSPLUS
1
2
3
4
 cord.x <- c(-3,seq(-3,-2,0.01),-2) 
 cord.y <- c(0,dnorm(seq(-3,-2,0.01)),0) 
 curve(dnorm(x,0,1),xlim=c(-3,3),main='Normal padrao') 
 polygon(cord.x,cord.y,col='skyblue')

Que resulta na figura:

Gráfico final.

Comentários

Note que utilizamos a função de densidade da normal sem parâmetros, pois ela tem como padrão a normal padrão N(0,1). Para o caso de uma normal com outros parâmetros, ou no caso de outras distribuições de probabilidade ou funções, é necessário fornecer os parâmetros de acordo. Mais usos da função polígono assim como outras opções de configuração mais avançadas podem ser encontradas na documentação (?polygon) do R).

Tags: , , , ,

Comments are closed.