[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