
Senhores, Estou com uma dúvida com relação a reprodução de uma análise de um experimento em delineamento em lattice quadrado balanceado, tipo I, segundo Pimentel Gomes (cap 10). Escreve esse email baseado tanto no livro do Pimentel Gomes, como também no Cochran e Cox, cap 10, pag 274. Para quem interessar segue também um exemplo (teste) do livro Ramalho et al., Experimentação em Genética ... cap 11, pág 171 (mas não é estelionato, rsrs). Pois bem, como disse, trata-se da análise de blocos incompletos em lattice quadrado balanceado. A pergunta é: como obter a soma de quadrados de tratamentos ajustadas aos efeitos de blocos? E ainda, de que forma obter também as médias de tratamentos livre dos efeitos de blocos. Meu ponto de partida é o post do Walmes no wiki do LEG ( http://www.leg.ufpr.br/doku.php/ridiculas#analise_intrabloco_e_interbloco_de...). Todavia, minha implementação não "concorda" com o que lá é mostrado. Peço desculpas pela forma que procedi, mas a título didático me prendi exatamente ao modo como é originalmente apresentado em Cochran e Cox (pag 274) e seguindo o que lá é feito consegui reproduzir ipsis literis a análise. Assim, gostaria da ajuda de vocês para aprender um modo menos custoso de reproduzir o jeito original! Desde já agradeço qualquer ajuda/sugestão com relação a dúvida! Caso alguém se interesse disponibilizo outro conjunto de dados, da mesma natureza no mesmo lik, com o nome de "dados_magno.txt". att, FH Segue o CMR: rm(list = ls(all = TRUE)); ls() download <- read.table('http://dl.dropbox.com/u/38195533/dados_CC.txt', header = TRUE, # com cabecalho sep = '\t', # separador de celulas <TAB> dec = ',', # separador de decimal <, (virgula)> na.string = '.') # indicador de omissao ## lendo e transformando variaveis em fator dados <- transform(download, trat = factor(trat), # transforma em fator rep = factor(rep), # idem bloco = factor(bloco)) # ... str(dados) # estrutura da planilha ## fator bloco dentro de repeticoes dados$blocoDrep <- factor(with(dados, paste(rep, bloco, sep = ''))) ## niveis de cada fator **apenas auxiliar** r <- nlevels(dados$rep) k <- nlevels(dados$bloco) ## array do experimento **generalizacao da matrix do delineamento** X <- with(dados, tapply(resp, list(rep, blocoDrep, trat), mean, na.rm = TRUE)) ## totais dos fatores R <- apply(X, 1, sum, na.rm = TRUE) # repeticoes B <- apply(X, 2, sum, na.rm = TRUE) # blocos dentro de repeticoes T <- apply(X, 3, sum, na.rm = TRUE) # tratamentos ## somas de quadrados do 'jetinho' Pimentel Gomes Sx <- sum(X, na.rm = TRUE) Sx2 <- sum(X^2, na.rm = TRUE) C <- Sx^2 / sum(!is.na(X)) SQtotal <- Sx2 - C SQr <- ( 1 / k^2 ) * sum( R^2 ) - C SQt <- ( 1 / r ) * sum( T^2 ) - C SQb.unadj <- ( 1 / k ) * sum( B^2 ) - C SQe.DBC <- SQtotal - (SQr + SQt) ## totais dos blocos onde os tratamentos ocorrem... ver Cochran e Cox (cap 10, pag 274) X.tb <- apply(X, c(2, 3), function(x) sum(!is.na(x))) Bt <- t(X.tb) %*% B W <- k * T - (k + 1) * Bt + sum(T) ## outras somas de quadrados... blocos ajustados e erros SQb.adj <- sum(W^2) / ( k^3 * ( k + 1 ) ) SQe.intra <- SQe.DBC - SQb.adj Eb <- SQb.adj / (r * ( k - 1 )) Ee <- SQe.intra / ( ( k - 1 ) * ( r * k - k - 1 ) ) ## coeficiente 'mu' determina se existe ou nao ajuste das medias if( Eb <= Ee ) mu <- 0 else mu <- ( Eb - Ee ) / ( k * ( r - 1 ) * Eb ) Eel <- Ee * ( 1 + ( r * k * mu ) / ( k + 1 )) EDBC <- SQe.DBC / ( ( r - 1 ) * ( k^2 - 1 ) ) ## soma de quadrados de tratamentos ajustados **PROBLEMA** SQt.adj <- sum((T + mu * W - mean(T + mu * W))^2) / r ## montando quadro da ANOVA DofF <- c( (r - 1 ), ( k^2 - 1 ), ( k^2 - 1 ), ( r * ( k - 1 ) ), ( ( k - 1 ) * ( r * k - k - 1 ) ), ( ( r - 1 ) * ( k^2 - 1 ) ), ( ( k - 1 ) * ( r * k - k - 1 ) ), ( sum(!is.na(X)) - 1 )) SSs <- c(SQr, SQt, SQt.adj, SQb.adj, SQe.intra, SQe.DBC, Eel * (( k - 1 ) * ( r * k - k - 1 )), SQtotal) table <- cbind(DofF, SSs, SSs / DofF) dimnames(table) <- list(c('Rep', 'Trat. unadj.', ' Adj.', 'Bloco Adj.', 'Error Intra-bloco', ' DBC', ' Effective', 'Total'), c('Df', 'Sum Sq', 'Mean Sq')) ## teste F para tratamentos ajustados F.trat <- table[3, 3] / table[7, 3] p.trat <- pf(F.trat, table[3, 1], table[7, 1], lower.tail = FALSE) ## ajuste via aov ajuste <- aov(terms(resp ~ rep/bloco + trat, keep = TRUE), contrasts = list(rep = contr.sum, bloco = contr.sum, trat = contr.sum), data = dados) ## comparando resultados ## ANOVAS table # anova 'made by hands' c('F value' = F.trat, 'Pr(>F)' = p.trat) # teste F 'made by hands' summary(ajuste) # anova via aov() ## sugestao/implementacao do Walmes (Wiki do LEG) car::Anova(ajuste, type = 'III') drop1(ajuste, scope = .~., test = 'F') ## medias de tratamentos ajustadas data.frame(Unadj. = T / r, Adj. = (T + mu * W) / r, ## sugestao/implementacao do Walmes (Wiki do LEG) Outro = coef(ajuste)[1] + ajuste$contrasts$trat %*% coef(ajuste)[ajuste$assign == 3]) ## \EOF

Fernando, Já rodei os exemplos do Pimentel e do Ramalho et al. Implementação de ambos estão disponíveis nos scripts que levei para o Curso mais recente que dei na Embrapa Arroz e Feijão (que terminei ontem). O link para arquivos do curso é esse http://www.leg.ufpr.br/~walmes/cursoR/cnpaf2/ Pegue o script lati.R. Eu nunca olhei a implementação do C&Cox e fiquei curioso e imaginando será que os livros divergem? Meus códigos reproduzem o Pimentel. Bem, com os seus dados a análise que atualmente faço é essa rm(list=ls(all=TRUE)); ls() download <- read.table('http://dl.dropbox.com/u/38195533/dados_CC.txt', header = TRUE, # com cabecalho sep = '\t', # separador de celulas <TAB> dec = ',', # separador de decimal <, (virgula)> na.string = '.') # indicador de omissao str(download) ## lendo e transformando variaveis em fator dados <- transform(download, trat = factor(trat), # transforma em fator rep = factor(rep), # idem bloco = factor(bloco)) # ... all(complete.cases(dados)) # completo xtabs(~rep+trat, dados) xtabs(~rep+bloco, dados) xtabs(~bloco+trat+rep, dados) str(dados) # estrutura da planilha m0 <- lm(terms(resp~rep/bloco+trat, keep.order=TRUE), data=dados) anova(m0) require(doBy) popMeans(m0, effect="trat") require(nlme) dados$blocoin <- with(dados, interaction(rep, bloco, drop=TRUE)) mm0 <- lme(resp~rep+trat, random=~1|blocoin, dados) anova(mm0) popMeans(mm0, effect="trat") À disposição. Walmes. ========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================

Walmes, Obrigado pela prontidão! Pois bem, rodei o seu código... eis que: sua implementação confere com os resultados esperados relativos ao ajuste das médias com recuperação da informação interbloco (popmeans, do doBy quando o modelos é ajustado pelo lme()). No primeiro ajuste,, o do aov, o popmeans retorna as próprias médias aritméticas dos tratamentos, sem qualquer ajuste! O teste correto da soma de quadrados de tratamentos ajustados confere com Cochran & Cox! Infelizmente ainda não consegui recuperar as médias ajustadas intrabloco, mas com certeza o que é posto por você ajuda e muito! Obrigado... abraço, FH 2012/11/15 Walmes Zeviani <walmeszeviani@gmail.com>
Fernando,
Já rodei os exemplos do Pimentel e do Ramalho et al. Implementação de ambos estão disponíveis nos scripts que levei para o Curso mais recente que dei na Embrapa Arroz e Feijão (que terminei ontem). O link para arquivos do curso é esse
http://www.leg.ufpr.br/~walmes/cursoR/cnpaf2/
Pegue o script lati.R. Eu nunca olhei a implementação do C&Cox e fiquei curioso e imaginando será que os livros divergem? Meus códigos reproduzem o Pimentel. Bem, com os seus dados a análise que atualmente faço é essa
rm(list=ls(all=TRUE)); ls() download <- read.table('http://dl.dropbox.com/u/38195533/dados_CC.txt', header = TRUE, # com cabecalho sep = '\t', # separador de celulas <TAB> dec = ',', # separador de decimal <, (virgula)> na.string = '.') # indicador de omissao str(download)
## lendo e transformando variaveis em fator dados <- transform(download, trat = factor(trat), # transforma em fator rep = factor(rep), # idem bloco = factor(bloco)) # ...
all(complete.cases(dados)) # completo xtabs(~rep+trat, dados) xtabs(~rep+bloco, dados) xtabs(~bloco+trat+rep, dados)
str(dados) # estrutura da planilha
m0 <- lm(terms(resp~rep/bloco+trat, keep.order=TRUE), data=dados) anova(m0)
require(doBy) popMeans(m0, effect="trat")
require(nlme) dados$blocoin <- with(dados, interaction(rep, bloco, drop=TRUE)) mm0 <- lme(resp~rep+trat, random=~1|blocoin, dados) anova(mm0)
popMeans(mm0, effect="trat")
À disposição. Walmes.
========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Fernando, Acabei de conferir meus resultados com os do Ramalho et al, página 171. Eles não são exatamente iguais apesar de eu estar seguro sobre o modelo. Isso pode ser devido a tabela do livro estar com valores arredondados e os autores terem usado número com mais casas, algum erro de digitação na tabela ou magia negra do $@$ que foi o aplicativo considerado pelos autores para obter os resultados. Vai saber o que a caixa preta está fazendo. Segue a rotina que rodei. da <- read.table("http://www.leg.ufpr.br/~walmes/data/ramalho_milho.txt", header=TRUE, sep="\t", colClasses=rep(c("factor","numeric"),c(3,1))) str(da) m0 <- lm(terms(producao~repeticao/bloco+cultivar, keep.order=TRUE), data=da) anova(m0) require(doBy) popMeans(m0, effect="cultivar") À disposição. Walmes. ========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================
participantes (2)
-
FHRB Toledo
-
Walmes Zeviani