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:
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:
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:
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():
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:
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:
1 | polygon(cord.x,cord.y,col='skyblue') |
Se você seguiu as instruções até aqui terá obtido o gráfico abaixo:
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:
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:
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).