<div dir="ltr"><div>myf2 <- function(df){</div><div> pesoFun <- with(df, approxfun(Data, Peso))</div><div> dts <- with(df, range(Data))</div><div> dates <- seq(dts[1], dts[2], by='days')</div><div> pred <- data.frame(Data=dates, Animal=unique(df$Animal), PesoPred=pesoFun(dates))</div><div> merge(df, pred, all=TRUE)</div><div>}</div><div><br></div><div>library(plyr)</div><div>out <- ddply(dados2, .(Animal), myf2)</div><div><br></div><div><br></div><div>b</div></div><div class="gmail_extra"><br><div class="gmail_quote">Em 2 de outubro de 2014 21:57, Fernando Souza <span dir="ltr"><<a href="mailto:nandodesouza@gmail.com" target="_blank">nandodesouza@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>
É o seguinte. Os dados que tenho são de pesagens de animais . Em
geral estas pesagens são feitas a intervalos fixos (por exemplo a
cada 15 dias). sendo assim para estimar os pesos diários entre duas
pesagens eu pretendo interpolar 13 valores entre as medidas.
Acontece que nestes dados nas pesagens não ocorreram em intervalos
fixos e sendo assim para o animal 1 por e xemplo para a pesagem na
data 1 e pesagem na data 2 tenho intervalo de 13 dias, entre a
pesagem na data 2 e pesagem na data 3 tenho 10 dias de intervalo e o
mesmo ocorre para outros animais. Na função approx(x,y,n) é
possível definir o número de valores interpolados no argumento n. O
default é 50, ou seja ele interpola 50 dados entre dois pares
(x1,y1) (x2,y2) e 50 dados para os pares (x2,y2)(x3,y3). Acontece
que se no intervalo deste último par de coodernada (ond x(i) é data)
necessitar de 20 valores (intervalo de 20 dias) eu não tenho como
controlar, pois será gerado 50 dados. Por isso estou pensando em uma
forma de ler o intervalo entre duas coordenadas (x,y) e fornecer
este valor para o agumento n da função approx. <br>
<br>
Pois da forma como está sendo interpolado para alguns animais tenho
de deletar valores enquanto em outros terei de adicionar mais.<br>
<br>
Att<div><div class="h5"><br>
<div>On 02-10-2014 19:47, Benilton Carvalho
wrote:<br>
</div>
<blockquote type="cite">
<p dir="ltr">Oi Fernando, o problema é que não entendo o que é o
valor de n que vc quer para cada caso. b</p>
<div class="gmail_quote">On Oct 2, 2014 4:16 PM, "Fernando Souza"
<<a href="mailto:nandodesouza@gmail.com" target="_blank">nandodesouza@gmail.com</a>>
wrote:<br type="attribution">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"> Caro Benilton, tudo
bem?<br>
O código que você me passou fez exatamente o que eu queria,
mas estou tendo o seguinte problema.<br>
Na função approx () eu determino o número de medidas fixas
(n) entre observações. No entanto eu tenho número de
observações diferentes entre animais e intervalo entre
observações diferentes.<br>
Por exemplo: Animal 1 possuo 4 pesagens intervaladas de 10
dias (ou seja 40 observações) ,animal 2 tenho 3 pesagens
intervaladas 15 dias (75 observações) etc... e sendo assim
ao determinar um número fixo (n) p.ex aprrox(x,y,n=15) eu
terei 60 observações para o animal 1 (excedente de 10) e 75
observações animais 2 (exato)<br>
<br>
Eu estou pensando em uma função que pudesse alterar o valor
de n para cada intervalo entre observações. Como é possível
fazer isso<br>
<br>
dados2<-structure(list(Animal = structure(c(1L, 1L, 1L,
1L, 1L, 1L, 8L, <br>
8L, 8L, 16L, 16L, 16L, 16L, 16L, 16L, 24L, 24L, 24L, 34L,
34L, <br>
34L, 37L, 37L, 37L, 37L, 37L, 37L), .Label = c("1", "12",
"14", <br>
"15", "17", "18", "19", "2", "21", "22", "23", "25", "26",
"*27", <br>
"28", "3", "30", "32", "34", "35", "37", "38", "39", "4",
"40", <br>
"41", "42", "43", "44", "46", "47", "48", "49", "5", "50",
"53", <br>
"7", "8", "9"), class = "factor"), Gest = c(140L, 140L,
140L, <br>
140L, 140L, 140L, 100L, 100L, 100L, 130L, 130L, 130L, 130L,
130L, <br>
130L, 100L, 100L, 100L, 100L, 100L, 100L, 140L, 140L, 140L,
140L, <br>
140L, 140L), Manej = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, <br>
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, <br>
2L), Data = structure(c(-715270, -715256, -715241, -715228,
-715214, <br>
-715193, -715270, -715256, -715235, -715270, -715256,
-715241, <br>
-715228, -715214, -715200, -715270, -715256, -715235,
-715270, <br>
-715256, -715235, -715270, -715256, -715241, -715228,
-715214, <br>
-715193), class = "Date"), IntervaloPeso = c(14L, 15L, 13L,
14L, <br>
21L, 0L, 14L, 21L, 0L, 14L, 15L, 13L, 14L, 14L, 0L, 14L,
21L, <br>
0L, 14L, 21L, 0L, 14L, 15L, 13L, 14L, 21L, 0L), Peso = c(37,
<br>
38.2, 41, 42.9, 43, 49, 40, 41.8, 40.8, 38, 39.9, 41.9,
45.2, <br>
46.2, 51.8, 40, 40.9, 41.9, 32.3, 34.9, 35, 35.1, 36.5,
35.2, <br>
38.3, 38, 40.5)), .Names = c("Animal", "Gest", "Manej",
"Data", <br>
"IntervaloPeso", "Peso"), row.names = c(NA, 27L), class =
"data.frame")<br>
<br>
library(plyr)<br>
library(zoo)<br>
intervalo<- ddply(dados2, .(Animal), summarise, intervalo
= diff(Data)) #intervalo entre medidas<br>
n_observacao<- as.vector(table(dados2$Animal)) #nunero de
observações em cada animal<br>
#----------------------------------------------------------------------------------------------------------------------------<br>
#isso é que esto tentando fazer ! mas não funciona<br>
myf2<-function(mydf,intervalo){<br>
+ for(i in 1:length(intervalo$periodo)){<br>
+ approx(mydf$Data,mydf$Peso,n=intervalo$periodo[i])}<br>
}<br>
res <- dlply(dados2, .(Animal), myf2)<br>
<br>
#-----------------------------------------------------------------------------------------------<br>
Exemplo do Benilton, n fixo igual a 15<br>
<br>
myf <- function(mydf)<br>
with(mydf, approx(Data, Peso,n= 15)) #esta funçao
realiza a interpolaçao agrupada por animal<br>
<br>
res <- dlply(dados2, .(Animal), myf)<br>
<br>
<br>
<br>
#------------------------------------Conversão da lista Res
para
dataframe--------------------------------------------------------------------------------------<br>
<br>
df<-data.frame(Data=unlist(sapply(res, "[",
1)),Peso=unlist(sapply(res,"[",2))) #remove os dados da
lista e o converte em data frame<br>
ID<-row.names(df)#captura os nomes das linhas do data
frame<br>
df<-cbind(ID,df)#adiciona os nomes da linha como coluna
de identificaçao<br>
row.names(df)<-NULL#remove nome das linhas<br>
df$Data<-as.Date(df$Data) #base de dados com formato de
data corrigida<br>
df$Animal<-factor(rep(unique(levels(dados2$Animal)),each=50))<br>
<br>
<div>On 01-10-2014 15:50, Benilton Carvalho wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Oi Fernando,
<div><br>
</div>
<div>alguns comentarios antes.... Quando vc diz de
interpolar, vc quer "peso" como sendo sua variavel "Y"
e "dia/data/etc" como eixo "X"... correto?</div>
<div><br>
</div>
<div>Se for este o caso, a sua chamada de 'approx' esta'
incorreta... o "X" e' o primeiro argumento... e o "Y"
e' o segundo.</div>
<div><br>
</div>
<div>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).</div>
<div><br>
</div>
<div>Usando o seu conjunto de dados de exemplo (colado
abaixo apenas para conveniencia):</div>
<div><br>
</div>
<div>
<div>set.seed(20)</div>
<div>dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),</div>
<div> Peso=rnorm(20,30,4),</div>
<div>
data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),</div>
<div>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30),
20),</div>
<div> day=1:20)</div>
</div>
<div><br>
</div>
<div>Tudo o que vc precisa e' criar uma funcao que
funcione num data.frame de mesma estrutura que este
acima.... Veja o codigo abaixo:</div>
<div><br>
</div>
<div>
<div>myf <- function(mydf)</div>
<div> with(mydf, approx(data, Peso))</div>
</div>
<div><br>
</div>
<div>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...</div>
<div><br>
</div>
<div>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'...</div>
<div><br>
</div>
<div>
<div>library(plyr)</div>
<div>res <- dlply(dados, .(ANIMAL), myf)</div>
</div>
<div><br>
</div>
<div>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...</div>
<div><br>
</div>
<div>b</div>
<div><br>
</div>
<div><br>
</div>
<div>
<div>
<div>set.seed(20)</div>
<div>dados<-data.frame(ANIMAL=factor(rep(1:5,each=4)),</div>
<div> Peso=rnorm(20,30,4),</div>
<div>
data=sample(seq(as.Date("01/04/2009",'%d/%m/%Y'),</div>
<div>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30),
20),</div>
<div> day=1:20)</div>
</div>
</div>
<div>
<div>
<div>myf <- function(mydf)</div>
<div> with(mydf, approx(data, Peso))</div>
</div>
</div>
<div>
<div>
<div>library(plyr)</div>
<div>res <- dlply(dados, .(ANIMAL), myf)</div>
</div>
</div>
<div><br>
</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">Em 1 de outubro de 2014 14:16,
Fernando Souza <span dir="ltr"><<a href="mailto:nandodesouza@gmail.com" target="_blank">nandodesouza@gmail.com</a>></span>
escreveu:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Caros
amigos<br>
<br>
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.<br>
<br>
set.seed(20)<br>
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'),<br>
as.Date("30/04/2009",'%d/%m/%Y'),length.out=30),20),day=1:20)<br>
<br>
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.<br>
Alguém poderia me ajudar? Abraços<br>
<br>
aprendendo<-function(dados){<br>
niveis<-levels(dados$ANIMAL)<br>
dia<-diff(dados$data)<br>
for(i in min(niveis):max(niveis)){<br>
<br>
b<-
approx(dados[dados$ANIMAL==as.numeric(i),]$Peso,dados[dados$ANIMAL==as.numeric(i),]$data),n=15)<br>
}<br>
return(b)<br>
}<br>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>)
e forneça código mínimo reproduzível.<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
R-br mailing list
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.</pre>
</blockquote>
<br>
</div>
<br>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>)
e forneça código mínimo reproduzível.<br>
</blockquote>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
R-br mailing list
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.</pre>
</blockquote>
<br>
</div></div></div>
</blockquote></div><br></div>