Optimisation

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Vincent Boulanger
Messages : 76
Enregistré le : 25 Avr 2006, 11:59

Optimisation

Messagepar Vincent Boulanger » 10 Juil 2009, 09:59

Bonjour à tous,

un petit soucis d'optimisation :

j'ai un data.frame du type :

Code : Tout sélectionner

                   esp freq_reech_1976 freq_reech_2006 num_retirage
2           Abies alba               2               4            1
3 Abietinella abietina               1               0            1
4       Acer campestre             232             260            1
5     Acer platanoides              13              51            1
6  Acer pseudoplatanus              43             131            1
7 Achillea millefolium               0               2            1


Le tableau complet fait plusieurs dizaines de milliers de lignes et je souhaite calculer, pour chaque ligne la pvalue du test du chi2 sur les "freq_reech_1976" et "freq_reech_2006" du type

Code : Tout sélectionner

chisq.test(matrix(c(freq_reech_1976, 326-freq_reech_1976, freq_reech_1976, 326-freq_reech_1976), ncol=2))$p.value


Avec une boucle for, c'est simple à programmer mais c'est interminable comme calcul.
Comment faire avec la fonction apply ?

Merci d'avance,

VB
Vincent Boulanger
Ingénieur Forestier
Doctorant Cemagref/INRA/ONCFS

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 10 Juil 2009, 10:12

Quelque chose comme ça devrait marcher :

Code : Tout sélectionner

apply(data,1,function (x) x <- chisq.test(matrix(c(x[1], 326-x[1], x[2], 326-x[2), ncol=2))$p.value)


J'ai mis les valeurs en 2006 (x[2]) dans la matrice car je suppose qu'elle doivent aussi y rentrer (dans l'exemple fournit c'est que 1976 qui est donné)

Vincent Boulanger
Messages : 76
Enregistré le : 25 Avr 2006, 11:59

Messagepar Vincent Boulanger » 10 Juil 2009, 11:35

J'ai mis les valeurs en 2006 (x[2]) dans la matrice car je suppose qu'elle doivent aussi y rentrer (dans l'exemple fournit c'est que 1976 qui est donné)


En effet, un copier coller un peu rapide, il s'agissait bien des fréquences 2006...

Dans l'état, ça ne tournait pas, il a juste fallu cette petite adaptation et ça roule :

Code : Tout sélectionner

fun1<-function (x) chisq.test(matrix(c(as.numeric(x[2]), 326-as.numeric(x[2]), as.numeric(x[3]), 326-as.numeric(x[3])), ncol=2))$p.value
apply(data,1,fun1)


Merci !

VB
Vincent Boulanger

Ingénieur Forestier

Doctorant Cemagref/INRA/ONCFS


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité

cron