====== RStudio ferramenta didática ====== Essa página é destinada a coleção de funções R para auxílio no ensino de estatística com o editor RStudio. O objetivo principal é reunir aqui implementações empregando a função ''manipulate::manipulate()'' para fazer gráficos interativos. Em segundo plano ficam dicas de como otimizar o uso desse editor. Lista de implementações a fazer: * Gráfico de densidade de probabilidade com controle nos parâmetros; * Histograma com controle no número de classes, intervalo de classe e tipo de frequência; * ✔ Gráfico de densidade controlando o bandwidth e tipo de função kernel (Walmes); * ✔ Boxplot com controle no critério de representação dos extremos (Walmes); * Gráfico para ilustrar poder do teste controlando a diferença entre as médias; * ✔ Gráfico da densidade normal padrão com destaque para área acumulada até o quantil (Walmes); * Gráfico da reta ajustada e pontos ilustrando alavancagem; * Gráfico para ilustrar obtenção de valores iniciais para usar no ajuste de modelos de regressão não linear; * Gráfico qqplot alterando o valor de lambda da tranformação boxcox; * ✔ Gráfico tridimensional variando o ângulo de observação (Walmes); * Aproximação da binomial pela normal controlando o valor de p; * ✔ Outras Aproximações pela normal; * Convergência da média de realizações binomial, Poisson, beta, etc, para uma distribuição normal controlando tamanho da amostra; * ✔ Gráfico para estudo de medidas de influência em modelos de regressão linear (Walmes); * ✔ Teste de normalidade aplicado aos dados e aos resíduos (Walmes); * ✔ Teste de correlação para dados e resíduos de experimentos (Walmes); * ✔ Taxa de erro tipo I e tipo II (Walmes). Dicas sobre o editor: * o atalho ''alt+-'' faz o sinal de atribuição ''<''''-''; ==== Gráfico tridimensional variando o ângulo de observação ==== # por Walmes ------------------------------------------------ require(manipulate) require(lattice) da <- expand.grid(x=seq(0,10,l=30), z=seq(0,10,l=30)) da$y <- with(da, x+z+0.2*x*z) # gera dados manipulate( ## faz o gráfico tridimensional wireframe(y~x+z, da, screen=list(z=z.angle, x=-60)), ## controla o valor do z.angle z.angle=slider(0, 360, 10)) #------------------------------------------------------------ ==== Gráfico da densidade normal padrão com destaque para área acumulada até o quantil ==== # por Walmes ------------------------------------------------ require(manipulate) manipulate( { curve(dnorm(x, 0, 1), -5, 5, ylab="f(x)") x <- seq(-5, q, by=0.05) fx <- dnorm(x, 0, 1) polygon(c(x, rev(x)), c(fx, rep(0, length(fx))), col="gray90") Pr <- round(pnorm(q, 0, 1), digits=3) legend("topleft", bty="n", legend=substitute(P(X ==== Gráfico de densidade controlando o bandwidth e tipo de função kernel ==== # por Walmes ------------------------------------------------ require(manipulate) x <- rgamma(300, 3, 7) manipulate( { plot(density(x, bw=bw, kernel=kernel)) if(show.rug==TRUE) rug(x) }, kernel=picker("gaussian", "epanechnikov", "rectangular", "triangular", "biweight","cosine", "optcosine"), bw=slider(0.01, 0.15, step=0.003, initial=0.05), show.rug=checkbox(TRUE, "show rug") ) #------------------------------------------------------------ ==== Aproximações pela normal ==== require(manipulate) ## ## Poisson e normal ## manipulate( { XM <- floor(lam+4*sqrt(lam)) curve(dpois(x, lambda=lam), 0, XM, n=XM+1, ylab="P[X=x] / f(x)", type="h") curve(dnorm(x, m=lam, sd=sqrt(lam)), 0, XM, add=T, col=2) legend("topright", c("Poisson", "Normal"), lty=1, col=1:2) title(substitute(lambda == l, list(l=lam))) }, lam=slider(0.5, 30, step=0.5) ) ## ## t e normal ## manipulate( { curve(dt(x, df=df), -4, 4, ylim=c(0, 0.4), ylab="densidade f(x)") curve(dnorm(x), -4, 4, add=T, col=2) legend("topright", c(substitute(t[nu == a], list(a=df)), expression(N(0,1))), lty=1, col=1:2) }, df = slider(1, 40) ) ## ## Chi^2 e normal ## manipulate( { curve(dchisq(x, df=df), 0, df+4*sqrt(2*df), ylab="densidade f(x)") curve(dnorm(x, m=df, sd=sqrt(2*df)), 0, df+4*sqrt(2*df), add=T, col=2) legend("topright", leg=eval(substitute(c(expression(chi[nu==df]^2), expression(N(mu==df,sigma^2==df2))), list(df2=2*df, df=df)), ), lty=1, col=1:2) }, df=slider(1,50) ) ==== Gráfico de duas densidades normais com destaque para áreas acumuladas até o quantil ==== (Veja o enunciado deste exemplo em [[http://www.leg.ufpr.br/~silvia/CE055/node49.html]]) # por Silvia ------------------------------------------------ manipulate( { curve(dnorm(x, 1.25, 0.12), 0.8, 2, ylab="f(x)",xlim=c(0.8,2)) x <- seq(0.8, q, by=0.01) fx <- dnorm(x, 1.25, 0.12) polygon(c(x, rev(x)), c(fx, rep(0, length(fx))), col="gray90") Pr1 <- round(pnorm(q, 1.25, 0.12), digits=3) legend("topleft", bty="n", legend=substitute(P(X1 ==== Boxplot com controle no critério de representação dos extremos ==== # por Walmes ------------------------------------------------ require(manipulate) manipulate( { x <- rep(1:10, 2) x[20] <- extreme gr <- gl(2, 10) bp <- boxplot(x~gr, outline=outline, range=range, notch=notch, plot=FALSE) inf <- bp$stats[4,2] sup <- inf+range*diff(bp$stats[c(2,4),2]) ylim <- extendrange(r=c(min(x), max(c(x,sup))), f=0.05) boxplot(x~gr, outline=outline, range=range, notch=notch, ylim=ylim) arrows(1.5, inf, 1.5, sup, angle=90, code=3, length=0.1) }, extreme=slider(10, 30, step=0.5, initial=10), range=slider(1, 4, step=0.1, initial=1.5), outline=checkbox(TRUE, "show.outlier"), notch=checkbox(FALSE, "show.interval") ) #------------------------------------------------------------ ==== Gráfico para estudo de medidas de influência em modelos de regressão linear ==== # por Walmes ------------------------------------------------ require(manipulate) data(anscombe) ans0 <- anscombe[,c("x1","y1")] ans0 <- ans0[order(ans0$x1),] rownames(ans0) <- NULL ans1 <- ans0 rx <- 2*diff(range(ans1$x1)) ry <- 2*diff(range(ans1$y1)) cols <- rep(1,nrow(ans0)) layout(matrix(c(1,2,1,3,4,5),2,3)) manipulate({ ans1[po,] <- ans0[po,]+c(dx,dy) plot(ans1) points(ans1[po,], col="red", pch=19) abline(a=3, b=0.5, col="gray50", lty=2) m1 <- lm(y1~x1, data=ans1) abline(m1, col=2) h <- hatvalues(m1)[po] r <- residuals(m1)[po] legend("topleft", bty="n", legend=c(substitute(h==ha, list(ha=round(h,3))), substitute(r==re, list(re=round(r,3))))) legend("bottomright", legend=po, bty="n") plot(m1) }, po=slider(1,nrow(ans0), step=1, initial=5), dx=slider(-rx+0.001, rx, initial=0), dy=slider(-ry, ry, initial=0)) #------------------------------------------------------------ ==== Teste de normalidade aplicado aos dados e aos resíduos ==== # por Walmes ------------------------------------------------ par(mfrow=c(2,1)) manipulate({ m <- rep(seq(0,by=h1,length.out=nlev), nrep) x <- rnorm(m, m, sd) xp <- qqnorm(x); qqline(x) rug(xp$x); rug(xp$y, side=2) legend("topleft", legend=shapiro.test(x)$p, bty="n") m0 <- lm(x~factor(m)) xp <- qqnorm(residuals(m0)); qqline(residuals(m0)) rug(xp$x);rug(xp$y, side=2) legend("topleft", bty="n", legend=shapiro.test(residuals(m0))$p) }, h1=slider(0.001, 10, initial=1), nlev=slider(2, 15, initial=5), nrep=slider(2, 25, initial=5), sd=slider(0.01, 10, initial=1)) #------------------------------------------------------------ ==== Teste de correlação para dados e resíduos de experimentos ==== # por Walmes ------------------------------------------------ require(MASS) par(mfrow=c(2,1)) manipulate({ m <- rep(seq(0,by=h1,length.out=nlev), nrep) x <- mvrnorm(length(m), mu=c(0,0), Sigma=matrix(c(1,cor,cor,1),2,2)) x[,1] <- x[,1]+m; x[,2] <- x[,2]+m plot(x) legend("topleft", legend=cor.test(x[,1], x[,2])$est, bty="n") m0 <- aov(x~factor(m)) r <- residuals(m0) plot(r) legend("topleft", legend=cor.test(r[,1], r[,2])$est, bty="n") }, h1=slider(0,19.99,initial=0.01), nrep=slider(10,300,initial=20), nlev=slider(2,15,initial=5), cor=slider(-0.99,0.99,initial=0)) #------------------------------------------------------------ ==== Taxa de erro tipo I e tipo II ==== # por Walmes ------------------------------------------------ require(manipulate) n <- 70 xx <- seq(qnorm(0.9), 4, l=n) yy <- dnorm(xx, 0, 1) area <- function(x,y){ da <- rbind(cbind(x,y), c(x[1],y[1])) DA <- sapply(1:length(x), function(o){ dir <- da[o,1]*da[o+1,2] esp <- da[o,2]*da[o+1,1] c(dir, -esp) } ) abs(sum(apply(DA, 1, sum)/2)) } manipulate({ curve(dnorm(x, 0, 1), -4, 9, col=1, ylim=c(-0.15,0.5), yaxt="n", ylab="f(x)") axis(2, at=seq(0,0.4,0.1)) curve(dnorm(x, i, 1), col=2, add=TRUE) xx2 <- seq(-4+i, qnorm(0.9, i, 1)+2, l=n) yy2 <- dnorm(xx2, i, 1) xx2 <- c(min(xx2), xx2, max(xx2)) yy2 <- c(0,yy2,0) yy2 <- pmin(yy2, dnorm(xx2, 0, 1)) polygon(xx2, yy2, col="gray90") polygon(c(xx, rev(xx)), c(yy, rep(0, length(yy))), den=10) segments(i, 0, i, 0.4, col=2) segments(0, 0, 0, 0.4, col=1) tipo2 <- round(area(xx2,yy2), 3) text(2, -0.075, pos=1, label=expression(alpha==0.10)) arrows(2, -0.075, 2, -0.01, length=0.1) text(i/2, 0.45, pos=3, label=substitute(beta==b, list(b=tipo2))) arrows(i/2, 0.45, i/2, max(yy2)+0.01, length=0.1) }, i=slider(0, 6, step=0.01, initial=0) ) #------------------------------------------------------------