Addition dans R à l'intérieur de la fonction

Je suis en train d'écrire une fonction dans R qui a pour calculer les valeurs de deux vecteurs avant d'aller de l'avant et faire quelques autres trucs de fantaisie. Les deux vecteurs, R et B, sont donnés par la suite des conclusions finales:

Addition dans R à l'intérieur de la fonction

et

Addition dans R à l'intérieur de la fonction

où $\beta$ est une constante et la ts sont passés à la fonction et sont la survenue temps d'un événement. Donc, en gros, lorsque le i-ème événement se produit (au moment t_i), je calcule B(i) et R(i) qui sont des sommes réalisé en utilisant l'occurrence précédente fois t_k de mon cas jusqu'à ce moment.

Je voudrais trouver quelque chose de plus efficace que cette

r <- rep(0,length(t))
for(i in 2:length(t)) {
    r[i] <- sum((t[i]-t[which(t<t[i])])*exp(beta*(t[i]-t[which(t<t[i])])))
}
b <- rep(0,length(t))
for(i in 2:length(t)) {
    b[i] <- sum(((t[i]-t[which(t<t[i])])^2)*exp(beta*(t[i]-t[which(t<t[i])])))
}

qui, fondamentalement, calcule tout deux fois, même si la seule différence entre les deux est la place devant l'exponentielle. Des idées? Merci!

  • Quelle sera t généralement être? Si elle n'est pas trop gros, vous pouvez utiliser outer à la place de ceux for boucles.
  • Ils n'avaient tout simplement pas fourni un exemple de l'vecteur t, donc R pense que vous voulez sous-ensemble de la fonction t.
  • Uhhhh, ces boucles sont moches. La vectorisation est le Nom du jeu... Vous devriez être à l'aide d'un dataframe avec les colonnes t_i et t_k. Ensuite, on calcule la différence. Par la suite, l'utilisation ifelse sur la différence. Cela peut être fait sans boucles et devrait être calculé instantanément.
  • t est plutôt grand: plusieurs centaines de milliers d'entrées... @Pierre: je ne suis pas sûr de comprendre: ne doit faire deux colonnes? Aussi, dans le cas où il fait une différence, je viens d'ajouter dans la question de la définition de ce que mon ts sont.
  • Ok, semble être un peu plus complexe que je ne le pensais initialement. Créer une matrice avec la ligne de vecteur répété dans chaque ligne permettrait d'éviter la boucle, mais le but de devenir trop volumineux pour la mémoire... Pas une bonne affaire pour la force brute. Avez-vous pensé à trier le vecteur d'origine avec la position " i " conservé dans une deuxième colonne?
  • Si c'est vraiment destiné à être une somme sur tous les éléments de tk qui sont à moins de ti, alors il n'est pas bien définie de l'opération. Est-ce censé être une somme de plus de ti[j]<tk[j] ? Qu'est-ce que l'indice sur lequel vous souhaitez somme?
  • Ensuite, il y aurait cumsum fonctionnement, ... Si vous commencez avec le plus grand élément de ce qui devrait être faisable dans le temps linéaire, je pense 😉
  • Je vais au lit 😉 hâte de voir une solution d'ici demain @Carl_Witthoft
  • à chaque occurrence, de temps t_i (qui désigne la i-ème de la survenance d'un événement), je vais faire la sommation sur toutes les occurrence de fois AVANT que le temps t_i, dont j'ai noté que les t_k.
  • Facile, si l't_k sont triés 😉
  • J'ai en quelque sorte à eux quand je les passe à la fonction 🙂
  • Après avoir regardé d'un peu plus près en cela, je trouve que @Carl_Witthoft est droit. Sont les équations vraiment correcte? Peut-être vous pouvez nous donner également une intuition de ce que le problème est vraiment?
  • J'ai édité la question d'ajouter plus d'informations sur le problème. À chaque occurrence, de mon cas, je calcule B et R qui utilisent l'occurrence précédente de fois jusqu'à ce moment.

InformationsquelleAutor g_puffo | 2014-09-19