8
votes

Y a-t-il un moyen de forcer zoo :: Fonction rollmène pour renvoyer un vecteur la même longueur que son entrée? (Ou peut-être utiliser une autre fonction?)

Error in cbind(input, output) :
  number of rows of matrices must match (see arg 2)
Calls: print -> cbind
Execution halted
r zoo

3 commentaires

J'ai changé de titre car il n'a pas été dit clair que si la fonction RollMean n'a pas de paramètre pour calculer les cas de frontière, il y a peut-être quelque chose de similaire dans d'autres packages.


Cela a déjà été abordé dans ma réponse à votre question préalable: Stackoverflow.com/ Questions / 4418643 / Deuxilés - Moyenne mobile - Moyenne


Le titre modifié ne précise toujours pas quelle question que vous voulez répondre. Votre question concerne la durée de la production, à l'exception du dernier paragraphe où vous souhaitez mentionner une fonction qui voudrait gérer les cas de frontière.


3 Réponses :


14
votes

Regardez l'argument na.pad code> à rollmean () code>, puis définissez-le sur true code>. Raté le dernier bit; Donc, vous avez également besoin d'aligner les moyens à droite:

> ## model observed data
> mod <- smooth.spline(seq_along(input), input, df = 3)
> ## plot data and fitted spline
> plot(seq_along(input), input)
> lines(predict(mod, seq_along(input)), col = "red", lwd = 2)
> ## model the fudged MA
> mod2 <- smooth.spline(seq_along(input),
+                       c( cumsum(input[1:(k-1)]) / 1:(k-1),
+                         rollmean(input, k, align = "right") ), df = 3)
> ## add this estimated spline
> lines(predict(mod2, seq_along(input)), col = "blue", lwd = 2)


5 commentaires

Je connais Na.pad mais cela donne ce qu'il dit, c'est un vecteur de rembourrage avec Na's. Et ce n'est pas ce que je cherche, je veux que cette fonction calculille vraiment la moyenne de ces cas de frontière, comme je l'ai écrit dans le premier post.


@ user393087; Désolé, mais ce n'était pas clair. J'ai mis à jour ma réponse pour répondre à la sortie que vous vouliez. Je me demande pourquoi vous voulez calculer vos moyens comme ça? Les 3 premiers moyens ne sont pas la même "chose" que l'autre signifie calculé ...


Parce que je dois faire de la spline à la SND, toutes les données doivent être calculées de manière à pouvoir éventuellement plus supranger dans la plus grande mesure possible des erreurs des données manquantes. Donc, je pense que ce ne serait pas que Simble signifie d'effectuer cela.


@ user393087; La moyenne mobile (MA) est un moyen simpliste d'estimer le niveau sous-jacent ou l'attente d'une série de données. Lorsque vous modélisez une spline (ou quelque chose de similaire), vous essayez d'estimer le niveau sous-jacent ou l'attente également. Votre approche consiste à lisser les données deux fois et à fudger les extrémités parce que la MA n'est pas définie. Pourquoi ne pas estimer la spline directement des données?


@ user393087; J'ai mis à jour ma réponse pour discuter de lisser la MA ou les données brutes. Je trouve quelque peu ironique que vous essayez de minimiser les biais dans la spline ajustée en faisant forcir la maîtrise de ne pas fournir de données manquantes.



2
votes

Jusqu'à présent, la question a été considérée comme ambiguë par trois expériences r coders, mais il semble que vous souhaitiez avoir une sorte de valeur extrapolée pour les moyens manquants. Que vous souhaitiez que les valeurs imputées au début ou la fin ne soient pas claires. Ce code retournera un vecteur aligné à droite et remplacera le début NA avec la première valeur non NA. Il y aurait également la fonction na.LOCF dans le zoo si vous vouliez travailler avec des rouleaux alignés à gauche.

long.roll <- function(input, k) { rtroll <-  
                           rollmean(input, k, align="right", na.pad=TRUE)
                return(c(rep(rtroll[k], k-1), rtroll[-(1:(k-1))]) ) }
long.roll(input,4)
#  [1] 4.50 4.50 4.50 4.50 4.25 4.75 4.25 4.00 5.00 3.75 5.25 5.00 5.25
# [14] 5.25


5 commentaires

Comme Gabor a dit dans sa réponse à une question précédente du même utilisateur, la version de développement de zoo :: rollApply fait déjà ce que le questionneur veut. Beau effort cependant. ;-)


D'accord. Je n'avais pas vu votre commentaire parce que j'étais à l'époque, je suis déjà en train de regarder la réponse de Gabor, notant la "attraction à venir" d'un argument partiel et éteignant sa réponse avec le chidois USER393087 pour ne pas reconnaître une réponse de haute qualité.


& @Joshua long.roll et le développement zoo :: rollApply faire différentes choses avec l'extrapolation ". long.roll réplique la première moyenne valide dans le na , tandis que zoo :: rollApply avec partial = true calcule les moyens n'utilisant que les données disponibles. Ce dernier peut être obtenu via un cumsum pour le premier k-1 observations jusqu'à la nouvelle rollApply cran hits.


La réponse de G. Grothendieck: - mais comme sa réponse impliquée dev la version, c'est une bonne réponse aussi, mais la sortie est différentée de celle de Dev Rollmeuran: 4.333333 4.5 4.25 4.75 4.25 4 5 3.75 5.25 5 5.25 5.25 4.6666667 5.5


C'est différent. La différence provient de l'ambiguïté dans la spécification de ce qui est recherché aux extrémités. Je suppose que la nouvelle version de Gabor "glissera" la fenêtre moyenne de la droite et de la sortie à gauche, donc avec un argument k impair, il n'y aura pas besoin de spécifier un alignement droit ou gauche. La valeur [1] sera moyenne (x [1: ((k-1) / 2) et la valeur [longueur (x)] sera moyenne (x [(longueur (x) -1/2): longueur ( X)].



11
votes

Bien que ce soit une vieille question, pour que quiconque lisait ceci, j'espère que cela aide.

Utilisation de RollApply avec la moyenne de la fonction, et partielle = true conservera les valeurs initiales où la fonction ne peut pas être calculée. p>

x <- rollapply(input, width = 5, FUN = mean, align = "centre", partial = TRUE)

??rollapply 
??rollapplyr # for right aligned moving average


0 commentaires