[R-br] Classificar fosforo e textura do solo
Elias Krainski
eliaskrainski em yahoo.com.br
Segunda Maio 20 15:14:54 BRT 2013
Porque em vez de usar esse tipo escada de classificação você não usa um
tipo suave? Para mim, este último faz mais sentido. Veja exemplo de como
obter isso com a sua 'escada':
### Tabela da quinta aproximação
### Nível de Fósforo mg/dm3
###Argila% muito baixo Baixo Médio Bom Muito Bom
###60-100 <2.7(menor e igual) 2.8-5.4 5.5-8 8.1-12 >12
###35-60 <4 4.1-8 8.1-12 12.1-18 >18
###15-35 <6.6 6.7-12 12.1-20 20.1-30 >30
### 0-15 <10 10.1-20 20.1-30 30.1-45 >45
escada <- function(x, y, x.br, y.br, ...) {
ix <- findInterval(x, x.br, ...)+1
lr <- lapply(1:nrow(y.br), function(j) {
i <- which(ix==j)
list(i=i, r=findInterval(y[i], y.br[j,], ...)+1)
})
i <- sort(unlist(lapply(lr, function(x) x$i)),
index.return=TRUE, method='quick')$ix
unlist(lapply(lr, function(x) x$r))[i]
}
### exemplo simulado
n <- 30000
x <- 90*runif(n)
y <- runif(n, 0, 100-x)*.7
cfosf <- rbind(c(10, 20, 30, 45), c(6.6, 12, 20, 30),
c(4, 8, 12, 18), c(2.7, 5.4, 8, 12))
cfosf
res <- escada(x, y, c(15, 35, 60), cfosf)
table(res)
plot(x, y, col=res, pch=19, las=1, asp=1, cex=0.3,
xlab="Argila", ylab="Fósforo")
abline(v=c(15, 35, 60), col=gray(.7))
for (j in 1:nrow(cfosf))
segments(c(0, 15, 35, 60)[j], cfosf[j,],
c(15, 35, 60, 100)[j], cfosf[j,], lty=3)
legend("topright", c("Muito baixo", "Baixo", "Médio", "Muito bom"),
pch=19, col=1:5, bty='n', title='Textura')
segments(0,100,100,0, lty=3)
### usando esses dados simulados
### (ideal e' usar dados reais)
### para obter uma funcao suave
require(MASS)
aj <- polr(resp ~ x*y, data.frame(resp=factor(res, ordered=TRUE)))
prd <- predict(aj)
plot(x, y, col=unclass(prd), pch=19, las=1, asp=1, cex=0.3,
xlab="Argila", ylab="Fósforo")
legend("topright", c("Muito baixo", "Baixo", "Médio", "Muito bom"),
pch=19, col=1:5, bty='n', title='Textura')
### classificando um novo solo (Argila=36, fosforo=19)
### usando a escada:
escada(36, 19, c(15, 35, 60), cfosf)
### suave:
predict(aj, newdata=data.frame(x=36, y=19))
Att.
Elias.
> ------------------------------------------------------------------------
> Em 18/05/2013 09:28, *Hélio Gallo Rocha < heliogallorocha em gmail.com >*
> escreveu:
> Bom dia a todos,
> Para recomendar adubação fosfatada é necessário classificar a
> quantidade de fósforo da análise em conjunto a textura do solo.
> Tabela da quinta aproximação
>
>
>
> Nível de Fósforo mg/dm3
>
> Argila%
>
>
>
> muito baixo
>
>
>
> Baixo
>
>
>
> Médio
>
>
>
> Bom
>
>
>
> Muito Bom
>
> 60-100
>
>
>
> <2.7 (menor e igual)
>
>
>
> 2.8-5.4
>
>
>
> 5.5-8
>
>
>
> 8.1-12
>
>
>
> >12
>
> 35-60
>
>
>
> <4
>
>
>
> 4.1-8
>
>
>
> 8.1-12
>
>
>
> 12.1-18
>
>
>
> >18
>
> 15-35
>
>
>
> <6.6
>
>
>
> 6.7-12
>
>
>
> 12.1-20
>
>
>
> 20.1-30
>
>
>
> >30
>
> 0-15
>
>
>
> <10
>
>
>
> 10.1-20
>
>
>
> 20.1-30
>
>
>
> 30.1-45
>
>
>
> >45
>
>
>
> Fiz o seguinte:
> solo=c(1:50) # resultado da análise do solo
> argila=c(60,35,15,0) # teor de argila
> p1=c(0,2.7,5.4,8,12) # fósforo com + de 60% de argila
> p2=c(0,4,8,12,18) # fósforo com 35 a 60% de argila
> p3=c(0,6.6,12,20,30) # fósforo com 15 a 35% de argila
> p4=c(0,10,20,30,45) # fósforo com < 15% de argila
> res=c("Muito.Baixo","Baixo", "Medio", "Alto", "Muito.alto")
> Assim se o resultado de P é 3.5 :
> 60% de arg, seria classificado como Baixo
> 35% de arg. seria classificado como muito baixo
> andei dando uma olhada na solução do post
>
>
> Uso do ifelse
>
> A saida desta função seria casada com uma recomendação,
> Grato a todos
> --
> Hélio Gallo Rocha
> IFSULDEMINAS - Câmpus Muzambinho
>
>
> _______________________________________________
> R-br mailing list
> R-br em 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.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20130520/22ef2367/attachment.html>
Mais detalhes sobre a lista de discussão R-br