[R-br] função de interpolação
Fernando Souza
nandodesouza em gmail.com
Quarta Outubro 1 16:16:07 BRT 2014
Muito obrigado Benilton! Era exatamente isso que queria.
Estava seguindo por caminhos tão complicados.
Obrigado por tudo
On 01-10-2014 15:50, Benilton Carvalho wrote:
> Oi Fernando,
>
> alguns comentarios antes.... Quando vc diz de interpolar, vc quer
> "peso" como sendo sua variavel "Y" e "dia/data/etc" como eixo "X"...
> correto?
>
> Se for este o caso, a sua chamada de 'approx' esta' incorreta... o "X"
> e' o primeiro argumento... e o "Y" e' o segundo.
>
> Alem disso, no codigo abaixo, colocarei a interpolacao para funcionar
> direto das datas... se isso vai fazer sentido (ou nao), deixo pra vc
> "descobrir" (a dica e' que o R vai achar uma representacao numerica
> para data e converte-la antes do ajuste... experimente um pouco e veja
> se e' conveniente para o seu caso. Se nao for, crie a variavel
> adequada a priori).
>
> Usando o seu conjunto de dados de exemplo (colado abaixo apenas para
> conveniencia):
>
> set.seed(20)
> dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),
> Peso=rnorm(20,30,4),
> data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),
> as.Date("30/04/2009",'%d/%m/%Y'),length.out=30), 20),
> day=1:20)
>
> Tudo o que vc precisa e' criar uma funcao que funcione num data.frame
> de mesma estrutura que este acima.... Veja o codigo abaixo:
>
> myf <- function(mydf)
> with(mydf, approx(data, Peso))
>
> Tudo o que a funcao 'myf' faz e' a interpolacao Peso x data num
> data.frame generico chamado 'mydf'... Note que a funcao e' burra o
> suficiente pra nao saber que existem animais diferentes... mas se vc
> tivesse um data.frame para cada animal, isso funcionaria...
>
> Entao agora e' dividir os data.frames por animal e ter os
> resultados... Para isso, eu gosto de usar o pacote 'plyr'... Como a
> entrada de dados e' a partir de um data.frame (d) e a saida eu quero
> que seja numa lista (l), entao vc usa o comando 'dlply'...
>
> library(plyr)
> res <- dlply(dados, .(ANIMAL), myf)
>
> Por fim, o que isso faz e': pegar o seu data.frame completo, quebrar
> em data.frames menores usando a variavel 'ANIMAL' e, em cada
> data.frame menor, aplicar a funcao 'myf'.... Seu resultado 'res', e'
> uma lista... cada elemento da lista e' um resultado do approx para
> cada animal...
>
> b
>
>
> set.seed(20)
> dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),
> Peso=rnorm(20,30,4),
> data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),
> as.Date("30/04/2009",'%d/%m/%Y'),length.out=30), 20),
> day=1:20)
> myf <- function(mydf)
> with(mydf, approx(data, Peso))
> library(plyr)
> res <- dlply(dados, .(ANIMAL), myf)
>
>
>
> Em 1 de outubro de 2014 14:16, Fernando Souza <nandodesouza em gmail.com
> <mailto:nandodesouza em gmail.com>> escreveu:
>
> Caros amigos
>
> Estou necessitando faze a interpolação de algumas pesagens tomadas
> em diferentes animais. Eu preciso da interpolação feita para cada
> animal separadamente e o intervalo entre medidas não é fixo. Eu
> estou utilizando a função approx() no entanto devido ao número de
> animais utilizados fica muito dispendioso fazer fazer esta
> interpolação uma a uma. Por isso gostaria de uma função onde um
> pudesse automatizar este procedimento.
>
> set.seed(20)
> dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),Peso=rnorm(20,30,4),
> data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),
> as.Date("30/04/2009",'%d/%m/%Y'),length.out=30),20),day=1:20)
>
> Estou tentando fazer uma função que estime os pontos da
> interpolação agrupados por Animal . Entretanto tenho pouco
> conhecimento em programação para fazer isso. Tenho tentado fazer
> isso, sem muito sucesso.
> Alguém poderia me ajudar? Abraços
>
> aprendendo<-function(dados){
> niveis<-levels(dados$ANIMAL)
> dia<-diff(dados$data)
> for(i in min(niveis):max(niveis)){
>
> b<-
> approx(dados[dados$ANIMAL==as.numeric(i),]$Peso,dados[dados$ANIMAL==as.numeric(i),]$data),n=15)
> }
> return(b)
> }
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br <mailto: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.
>
>
>
>
> _______________________________________________
> 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/20141001/f9c9a6a6/attachment.html>
Mais detalhes sobre a lista de discussão R-br