2012-02-27 6 views
2

Si j'ai des relevés de direction du vent provenant d'une collection de girouettes, y a-t-il quelque chose comme t.test (ou un autre test de signification) que je peux effectuer sur les données circulaires? Je suppose une distribution normale (dont proviennent les données ci-dessous). J'ai trouvé le paquet CircStats, mais je me suis dit que je voudrais vérifier ici pour quelques conseils supplémentaires.Tests de signification circulaire

Certaines données de l'échantillon:

df1 <- data.frame(unit=letters, wind.direction=c(99,88,93,99,86,90,101,109,109,91,86,94,106,92,99,103,110,98,107,109,93,102,92,99,109,85)) 

Que l'on fonctionne très bien en utilisant seulement une norme t.test car il ne revient pas à zéro. Mais,

df2 <- data.frame(unit=letters, wind.direction=c(1,350,355,1,348,352,3,11,11,353,348,356,8,3,1,5,12,0,9,11,355,4,354,1,11,347)) 

ne fait pas puisque sa moyenne circulaire est ~ 0 mais moyenne linéaire est ~ 139 ...

+0

Est-ce que ce travail: 'DF2 $ wd.scaled = apply (as.matrice (df2 [, 2]), 1, fonction (x) ifelse (x> 180,360-x, x)) '; 'mean (df2 $ wd.scaled' = 6,69 . –

+0

@ baha-kev Certaines des girouettes sont loin d'être calibrées et j'aimerais les signaler, si souvent qu'il y en a une qui se lit entièrement dans la mauvaise direction, que je perdrais avec votre solution (par exemple, la moyenne est ~ 90 avec une lecture de palette ~ 270) – Justin

Répondre

1

Vous pouvez utiliser aov.circular, dans le package circular.

# Sample data (with two groups, to compare the means) 
library(circular) 
x <- as.circular( 
    c(1,350,355,1,348,352,3,11,11,353,348,356, 
    8,3,1,5,12,0,9,11,355,4,354,1,11,347), 
    unit="degrees" 
) 
g <- sample(LETTERS[1:2], 26, replace=TRUE) 
# Test 
aov.circular(x, g) 
+0

Parfait! 'CircStats' semblait un peu plus complexe que nécessaire – Justin

+0

Un suivi rapide: Je peux ensuite générer des intervalles de confiance à partir de 'mle .vonmises.bootstrap.ci (aov.circulaire (x, g) $ mu, mu = aov.circulaire (x, g) $ mu.all) 'correct? – Justin

0

C'est ce que je voulais dire:

> df2$wd.scaled = apply(as.matrix(df2[,2]),1,function(x) ifelse(x>180,x-360,x)) 
> df2 
    unit wind.direction wd2 wd.scaled 
1  a    1 1   1 
2  b   350 -10  -10 
3  c   355 -5  -5 
4  d    1 1   1 
5  e   348 -12  -12 
6  f   352 -8  -8 

> mean(df2$wd.scaled) 
[1] 0.3846154 

Cela pourrait fonctionner si vous n'avez pas beaucoup d'observations près de 180.