2010-06-24 7 views
0

I ont le nombre d'échantillons par unité et doivent calculer les statistiques avec R.R: Statistiques de la distribution

Le tableau est comme ça (toutes les lignes et les colonnes sont en réalité rempli de valeurs, je n'écris que quelques-uns ici pour une visibilité plus facile, et il y a beaucoup plus de colonnes):

 
Hour  1 2 3 4 

H1  72 11 98 65 

H2  19 27 

H3 

H4 

H5 

: 

H200000 

Ie la première heure (H1) il y avait 72 échantillons de valeur 1, 11 échantillons de valeur 2, etc. La deuxième heure (H2) il y avait 19 échantillons de valeur 1, 27 échantillons de valeur 2, etc.

J'ai besoin pour calculer la moyenne et l'écart-type par heure (c'est-à-dire par rangée). Comme il y a plusieurs milliers de lignes, j'ai besoin d'une méthode rapide.

Exemple: La moyenne-calcul manuel pour 1 heure (H1) serait:

 
(72x1 + 11x2 + 98x3 + 65x4)/(72+11+98+65) = 2.6 

Je suppose qu'il ya des méthodes R ou paquets qui peuvent le faire, mais je ne parviens pas à trouver où. Votre aide est grandement appréciée.

Merci, Chris

Répondre

2

Vous voulez calculer une moyenne pondérée, vous devez donc weighted.mean. Pour la première rangée:

values <- c(1, 2, 3, 4) 
weights <- c(72, 11, 98, 65) 
weighted.mean(values, weights) 

L'écart-type pondéré n'est pas bien défini. Vous pouvez utiliser un RMS pondéré à la main comme estimateur (mais cela suppose que votre échantillon d'entrée provient vraiment d'un seul gaussien, c'est-à-dire qu'il n'y a pas de valeurs aberrantes - je ne sais pas si c'est le cas pour votre exemple).

# same values and weights as above 
sqrt(sum(values^2*weights^2))/sum(weights) 

Vous devriez lire vos données dans un tableau et parcourir chaque ligne. En outre, "plusieurs milliers de lignes" n'est pas nécessairement un grand nombre pour un calcul aussi simple. Ceci est très élémentaire, peut-être vérifier un tutoriel serait également bénéfique.

+0

bonne réponse, mais n'itérer, utilisez 'apply' – nico

0

En supposant que votre table est une matrice appelée dataset de n * 20000 et vous avez les poids des moyeux dans un tableau weights il vous suffit de faire:

# The 1 as 2nd parameter indicates to apply the function on the rows 
w.means <- apply(dataset, 1, weighted.mean, w=weights) 
1

Vous êtes beaucoup mieux (à savoir des calculs plus rapides) matrice à l'aide opérations au lieu d'appliquer quelque chose par rangée. Par exemple, en supposant X est la matrice contenant vos données, vous pouvez obtenir les moyens pondérés de la manière suivante:

w <- 1:ncol(X) 
w <- w/sum(w) #scale to have a sum of 1 
wmeans <- X %*% w 
Questions connexes