[R-br] função de interpolação

Benilton Carvalho beniltoncarvalho em gmail.com
Quarta Outubro 1 15:50:43 BRT 2014


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>
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
> 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/e5050dc2/attachment.html>


Mais detalhes sobre a lista de discussão R-br