====== Juliano van Melis ====== {{:bie5782:01_curso_atual:alunos:trabalho_final:jvmelis:piqueno_no_mato_de_ribeirão.jpg?200|}} Doutorando em Biologia Vegetal, Instituto de Biologia, Unicamp. Interesses em ecologia de comunidades vegetais e de ecossistemas. [[http://buscatextual.cnpq.br/buscatextual/visualizacv.jsp?id=W2790125&tipo=simples&idiomaExibicao=2|Lattes]] ===== Meus Exercícios ===== [[.:exec]] ===== Meus planos ===== ==== Principal ==== Pensei numa função "curve finder" onde seria utilizada o AIC para que indicasse a curva que melhor se ajusta em uma relação bivariada (dois vetores). Os principais modelos de curvas a serem analisados nessas relações bivariadas seriam: no modelo linear (simples, quadrático e - talvez - polinomial), exponencial (e o modificado), o logarítmico, geométrico, (e talvez outros). A inspiração foi no [[http://curveexpert.webhop.biz/|curve expert]], que faz bem isso, mas usa estatística F para definir a curva com melhor ajuste e possui uns graficos bem feinhos. Aí o usuário do [[http://cran.r-project.org/|R]] receberia como resposta os graficos X por Y acrescentado as linhas para cada um dos modelos e a ordem dos modelos com os melhores ajustes e suas fórmulas. === Comentário PI === Boa proposta. Falta só definir se todos os modelos presumirão distribuição normal dos resíduos. Isto vai afetar a função que vc usará para ajuste. Se sim, será a função de regressão gaussiana não linear (''nls''). Se não, terás que partir para glm's, mas aí é complicar demais. O importante é deixar claro que os modelos são Gaussianos. ==== Script da Função ==== fit.model=function(x,y, res.normal=TRUE) { if(res.normal==TRUE) { lm(y~x)->ls lm(y~x+I(x^2))->lq lm(y~x+I(x^2)+I(x^3))->lp nls(y~a+exp(b*x), start=c("a"=1, "b"=2)) ->expo nls(y~a+b*log(x), start=c("a"=1e-5, "b"=1e-5))->loga nls(y~a*x/(b+x), start=c("a"=1, "b"=1))->sat nls(y~a*sin(b*x), start=c("a"=1, "b"=2))->sinus nls(y~a*I(x^b), start=c("a"=1, "b"=1)) -> pm AIC(ls, lq, lp, expo, loga, sat, sinus, pm)->AT AT[,2]->AT AT[AT<0]*(-1)->Akaike layout(matrix(c(1:9), 3, 3, byrow=TRUE)) plot(x,y, main="Linha de tendencia"); panel.smooth(x, y) plot(x, y, main="Modelo Linear Simples"); abline(x, y, col="red") plot(x, y, main="Modelo Linear Quadratico"); lines(x, lq$coef[1]+lq$coef[2]*x+lq$coef[3]*x^2, col="red") plot(x, y, main="Modelo linear Polinomial"); lines(x, lp$coef[1]+lp$coef[2]*x+lp$coef[3]*x^2+lp$coef[4]*x^4, col="red") plot(x, y, main="Modelo Exponencial"); coef(expo)->coexp; lines(coexp[1]+exp(coexp[2]*x), col="red") plot(y~x, main="Modelo Logarítmico"); coef(loga)->cologa; lines(cologa[1]+cologa[2]*log(x), col="red") plot(y~x, main="Modelo de Saturação"); coef(sat)->cosat; lines(cosat[1]*x/(cosat[2]+x), col="red")->l1 plot(x,y, main="Modelo Sinusoidal"); coef(sinus)->cosin; lines(cosin[1]*sin(cosin[2]*x), col="red") plot(x,y, main="Modelo de Potência"); coef(pm)->copm; lines(copm[1]*x^copm[2], col="red") x11() AIC(ls, lq, lp, expo, loga, sat, sinus, pm)->AT AT[,2]->AT AT[AT<0]*(-1)->Akaike layout(matrix(c(1:9), 3, 3, byrow=TRUE)) plot(y~x, main="Dispersão dos pontos") qqnorm(residuals(ls), main="Modelo Linear simples", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo Linear Quadrático", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo Linear Polinomial", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo Exponencial", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Normalidade dos Resíduos da Regressão \n no modelo Logarítmico", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo de Saturação", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo Sinusoidal", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) qqnorm(residuals(ls), main="Modelo de Potência", xlab="Quantis Teóricos", ylab="Quantis amostrados"); qqline(residuals(ls)) c("a+b*x", "a+b*x+c*x^2", "a+b*x+c*x^2+d*x^3", "a+exp(b*x)", "a+b*log(x)", "a*x/(b+x)", "a*sin(b*x)", "a*(x^b)")->formulas Modelo=c("Linear Simples", "Linear Quadrático", "Linear Polinomial", "Exponencial", "Logarítmico", "de Saturação", "Sinusoidal", "de Potência") as.vector(ls$coef)-> lsc; as.vector(lq$coef)-> lqc; as.vector(lq$coef)->lpc; as.vector(coef(expo))->coexp; as.vector(coef(loga))->cologa; as.vector(coef(sat))->cosat; as.vector(coef(sinus))->cosin; as.vector(coef(pm))->copm a=c(lsc[1], lqc[1], lpc[1], coexp[1], cologa[1], cosat[1], cosin[1], copm[1]) b=c(lsc[2], lqc[2], lpc[2], coexp[2], cologa[2], cosat[2], cosin[2], copm[2]) c=c("NA", lqc[3], lpc[3], "NA", "NA", "NA", "NA", "NA") d=c("NA", "NA", lpc[4], "NA", "NA", "NA", "NA", "NA") AIC(ls, lq, lp, expo, loga, sat, sinus, pm)->AT AkaikeIndexCriterion<-AT[,2] Ordem=order(AkaikeIndexCriterion) resultado=data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) print("Alerta: Verifique se a relação entre os quantis teóricos e os quantis amostrados dos resíduos dos modelos seguem a normalidade. \n Caso os resíduos dos modelos não sigam a normalidade: Use 'res.normal=FALSE' na função.") return(resultado) } if(res.normal==FALSE) { formulas=c("y~a+b*x","y~a+b*x+c*x^2", "y~a+b*x+c*x^2+d*x^3") glm(y~x)->simp glm(y~x+I(x^2))->quad glm(y~x+I(x^2)+I(x^3))->poli AIC(simp, quad, poli)->ATG ATG[,2]->AkaikeIndexCriterion Ordem=order(AkaikeIndexCriterion) a=c(simp$coef[1], quad$coef[1], poli$coef[1]) b=c(simp$coef[2], quad$coef[2], poli$coef[2]) c=c("NA", quad$coef[3], poli$coef[3]) d=c("NA", "NA", poli$coef[4]) Gaussiano<-data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) Y=y/max(y) X=x/max(x) glm(Y~X, family='binomial')->binos glm(Y~X+I(X^2), family=binomial())->binoq glm(Y~X+I(X^2)+I(X^3), family=binomial()) ->binop AIC(binos, binoq, binop)->ATG ATG[,2]->AkaikeIndexCriterion Ordem<-order(AkaikeIndexCriterion) a=c(binos$coef[1], binoq$coef[1], binop$coef[1]) b=c(binos$coef[2], binoq$coef[2], binop$coef[2]) c=c("NA", binoq$coef[3], binop$coef[3]) d=c("NA", "NA", binop$coef[4]) Binomial<-data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) glm(y~x, family=gamma()) -> gamms glm(y~x+I(x^2)+I(x^3), family=inverse.gaussian()) ->gammq glm(y~x+I(x^2)+I(x^3), family=inverse.gaussian()) ->gammp AIC(gamms, gammq, gammp)->ATG ATG[,2]->AkaikeIndexCriterion Ordem<-order(AkaikeIndexCriterion) a=c(gamms$coef[1], gammq$coef[1], gammp$coef[1]) b=c(gamms$coef[2], gammq$coef[2], gammp$coef[2]) c=c("NA", gammq$coef[3], gammp$coef[3]) d=c("NA", "NA", gammp$coef[4]) Gamma<-data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) glm(y~x, family=inverse.gaussian()) ->igauss glm(y~x+I(x^2)+I(x^3), family=inverse.gaussian()) ->igausq glm(y~x+I(x^2)+I(x^3), family=inverse.gaussian()) ->igausp AIC(iguass, igausq, igausp)->ATG ATG[,2]->AkaikeIndexCriterion Ordem<-order(AkaikeIndexCriterion) a=c(iguass$coef[1], iguasq$coef[1], iguasp$coef[1]) b=c(iguass$coef[2], iguasq$coef[2], iguasp$coef[2]) c=c("NA", iguasq$coef[3], iguasp$coef[3]) d=c("NA", "NA", iguasp$coef[4]) GaussianoInverso<-data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) glm(y~x, family=poisson())->poiss glm(y~x+I(x^2), family=poisson()) -> poisq glm(y~x+I(x^2)+I(x^3), family=poisson()) ->poisp AIC(poiss, poisq, poisp)->ATG ATG[,2]->AkaikeIndexCriterion Ordem<-order(AkaikeIndexCriterion) a=c(poiss$coef[1], poisq$coef[1], poisp$coef[1]) b=c(poiss$coef[2], poisq$coef[2], poisp$coef[2]) c=c("NA", poisq$coef[3], poisp$coef[3]) d=c("NA", "NA", poisp$coef[4]) Poisson<-data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) glm(y~x, family=quasi())->quasis glm(y~x+I(x^2), family=quasi()) -> quasiq glm(y~x+I(x^2)+I(x^3), family=quasi()) ->quasip AIC(quasis, quasiq, quasip)->ATG ATG[,2]->AkaikeIndexCriterion Ordem<-order(AkaikeIndexCriterion) a=c(quasis$coef[1], quasiq$coef[1], quasip$coef[1]) b=c(quasis$coef[2], quasiq$coef[2], quasip$coef[2]) c=c("NA", quasiq$coef[3], quasip$coef[3]) d=c("NA", "NA", quasip$coef[4]) QuasiGaussiano=data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) Y=y/max(y) X=x/max(x) glm(Y~X, family=quasibinomial())->quabis glm(Y~X+I(X^2), family=quasibinomial()) -> quabiq glm(Y~X+I(X^2)+I(X^3), family=quasibinomial()) ->quabip AIC(quabis, quabiq, quabip)->ATG ATG[,2]->AkaikeIndexCriterion Ordem=order(AkaikeIndexCriterion) a=c(quabis$coef[1], quabiq$coef[1], quabip$coef[1]) b=c(quabis$coef[2], quabiq$coef[2], quabip$coef[2]) c=c("NA", quabiq$coef[3], quabip$coef[3]) d=c("NA", "NA", quabip$coef[4]) QuasiBinomial=data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) glm(y~x, family=quasipoisson())->quapos glm(y~x+I(x^2), family=quasipoisson()) -> quapoq glm(y~x+I(x^2)+I(x^3), family=quasipoisson()) ->quapop AIC(quapos, quapoq, quapop)->ATG ATG[,2]->AkaikeIndexCriterion Ordem=order(AkaikeIndexCriterion) a=c(quapos$coef[1], quapoq$coef[1], quapop$coef[1]) b=c(quapos$coef[2], quapoq$coef[2], quapop$coef[2]) c=c("NA", quapoq$coef[3], quapop$coef[3]) d=c("NA", "NA", quapop$coef[4]) QuasiPoisson=data.frame(Ordem, Modelo, formulas, a, b, c, d, AkaikeIndexCriterion) resultglm=array(Gaussiano, Binomial, Gamma, GaussianoInverso, Poisson, QuasiGaussiano, QuasiBinomial, QuasiPoisson) return(resultglm) print("\n\n Os valores dos vetores deve estar entre 0 e 1 para que ocorra o modelo generalizado binomial \n\n Cuidado: Para o modelo generalizado Gamma, ao menos 1 argumento deve passar por 'gamma'.") } } ==== Página de Ajuda ==== fit.model package:nenhum R Documentation Ajuste de modelos entre dois vetores numéricos, usando o Índice de Critério de Akaike. Description Ajusta modelos lineares e não-lineares na relação entre dois vetores, classificando o melhor ajuste e no caso de distribuição normal dos resíduos no modelo (res.norm=TRUE) Usage: fit.model(x, y, res.normal = TRUE) Arguments: x um objeto da classe "vector", sendo com valores numéricos. Variável preditora y: um objeto da classe "vector", sendo com valores numéricos. Varipavel resposta res.normal: para resíduos com distribuição não normal use res.normal=FALSE para resíduos com distribuição gaussiana use o argumento res.normal=TRUE(default) Details: A função promove o ajuste do melhor modelo entre dois vetores, usando o Índice de Critério de Akaike (Akaike Index Criterion - AIC). Para a distribuição normal dos resíduos (res.normal=TRUE), também são dados os gráficosda variável resposta vs a variável preditora com o as curvas dos modelos. Além disso, é fornecido a distribuição teórica gaussiana vs observada dos quantis dos resíduos dos modelos. Dessa forma, o usuário pode ver se os resíduos do melhor modelo ajustado possui distribuição gaussiana. Para modelos generalizados (res.normal=FALSE), são ajustados três tipos de modelos: simples, quadrático e polinomial. Nesse caso, a resposta fornecida será um "array" com os dados de AIC e as fórmulas para cada um dos modelos generalizados testados (Gaussiano, Binomial, Gamma, GaussianoInverso, Poisson, QuasiGaussiano, QuasiBinomial, QuasiPoisson). Esses modelos são chamados de "family" pela função "glm". Warning: Os vetores não podem possuir NA's ou NAN's. Author(s): Versão original por Juliano van Melis jvmelis@yahoo.com.br References: Kelley, C. T.(1999). "Iterative Methods for Optimization, SIAM Frontiers in Applied Mathematics", no 18, ISBN: 0-89871-433-8. Nelder, J. & Wedderburn, R. (1972). "Generalized Linear Models". Journal of the Royal Statistical Society. Series A (General) 135 (3): 370–384. See Also: glm nls Examples: ==== Plano B ==== Envolveria estatística circular. A minha idéia seria comparar a riqueza ou abundância de determinada(s) espécie(s) em diferentes ecounidades florestais (Oldeman 1990: clareira-construção-bioestasia-degradação). Transformaria cada ecounidade em valores angulares e os valores a serem comparados nos eixos que saem do centro do gráfico. O teste V (Jammalamadaka & SenGupta 2001) seria utilizado para verificar a preferência da(s) espécies e/ou da sinúsia vegetal por determinado ângulo (ecounidade). Como o número de parcelas em cada ecounidade não é uniforme (p.ex: eco-unidades maduras 28-37%, [[http://www.teses.usp.br/teses/disponiveis/11/11150/tde-16072008-121520/|Cassola 2008]]), teria que ser utilizado valores proporcionais. Talvez fazer uma rarefação, reduzindo o número de parcelas para aquela que tiver menor número. Novamente, a inspiração vem de outro software ([[http://kovcomp.com/oriana/index.html|Oriana]]), que eu já tive que usar e que tem saídas gráficas sofríveis...Além de não ser um freeware. == Bibliografia == Cassola, H. (2008)Aspectos da estrutura fitossociológica e silvigenética em fragmentos de floresta estacional semidecídua com diferentes histórias de perturbação em Botucatu, SP. Dissertação Mestrado - ESALQ/USP, Piracicaba Jammalamadaka, S.R., SenGupta, A. (2001)Topics in Circular Statistics. Series on multivariate analysis, vol. 5. World Scientific Publishing Co.. Singapore Oldeman, R.A.A. (1990) Forests: Elements of Silvology. Springer-Verlag. Berlin === Comentário PI === Também muito boa. A minha crítica não é à função em si, mas á subsjetivdiade de converter cada econunidade em um ângulo. Se vc tivesse tempo de regeneração a coisa ficaria mais precisa, concordas? Mas isto não invalida o exercício de construir a função, que é adequado. === Comentário ao Comentário PI === Usei no relatório FAPESP do ano passado essa "subjetividade" pois o meu problema era exatamente como descrever a floresta amostrada. Eu tinha classificado essas ecounidades por Oldeman (1990), e como em campo eu não achava que cada parcela de 100m² era considerada como uma única ecounidade s.s., as vezes eu achava que uma parcela estava entre clareira e construção. Por isso não teríamos somente quatro angulos, mas 8 ângulos. A "subjetividade" ficou na análise visual em campo, pois não tinha experiência nessa classificação (Oldeman 1990). Para refinar a caracterização das ecounidades terei que usar análise multivariada para ver se as ecounidades formam grupos usando algumas variáveis características (altura do dossel médio, n de árvores mortas, IIC médio, n de árvores do presente/passado/futuro (Oldeman 1990), etc...). Não vou colocar o n de lianas pq __talvez__ enviese a relação que eu quero (ecounidades vs sinúsia de trepadeiras). Concordo que se eu tivesse o tempo de regenaração (que __talvez__ eu consiga usando os dados do Roque ([[http://libdigi.unicamp.br/document/?code=vtls000232390|2001]] e [[http://libdigi.unicamp.br/document/?code=vtls000430232|2007]]), o uso da estatística circular seria mais //robusta//. ==== Plano C ==== Se as outras duas propostas forem muito complicadas, também seria útil para um dos meus projetos a análise de covariância (ANCOVA), onde as retas de dois modelos lineares seriam comparadas, verificando se as retas são iguais (mesma inclinação) e paralelas (diferentes interceptos), ou se são distintas (valores de intercepto e inclinação significativamente diferentes). === Comentário PI === Este é tão fácil de fazer diretamente no R que não vejo muito sentido em criar uma função para isto. Mas as duas propostas anteriores são viáveis. ==== Plano D ==== Viro hippie. === Comentário PI === Não é original, mas é sempre uma opção. === Comentário ao Comentário PI === Não é original, mas seria desafiadora. O único artesanato que sou capaz de fazer são aviões de papel, no formato [[http://4.bp.blogspot.com/_UNogBuovHfY/SejAvi93jPI/AAAAAAAAACc/TVW-mT8lpc4/s320/bola-de-papel%5B1%5D.JPG|"estrela da morte"]] (by //Star Wars//).