[résolu] pb aggregate sur [,i] dans boucle

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

Quentin Lemouland
Messages : 27
Enregistré le : 03 Déc 2007, 07:28

[résolu] pb aggregate sur [,i] dans boucle

Messagepar Quentin Lemouland » 02 Déc 2008, 11:29

Bonjour,

Dans un étude spatiale, je cherche à montrer que les pieds d'une espèce végétale rélévée sont significativement à proximité de structures.
Les n pieds sont distribués aléatoirement 1000 fois, puis la distance de ces 1000*n pieds est calculée sous SIG. Il me suffit alors de comparer ma distance moyenne réelle à mes 1000 distances moyennes théoriques pour extraire la p-value.
Ayant réitéré la démarche sur plusieurs espèces, j'ai remarqué que le nombre de pieds distribués à une une nette influence sur la distribution des 1000 distances moyennes théoriques. La distance moyenne seuil pour un p-value de 0.05 varie donc avec le nombre de pieds (équivalent de dll). Je cherche à obtenir la courbe d'évolution de cette distance seuil par rapport au nombre de pieds distribués.

J'ai donc distribué aléatoirement un très grand nombre de points (100000) dans l'espace de ma zone d'étude et calculé leur distance par rapport aux structures paysagères.
J'ai ensuite importé la table attributaire de ces points sour R (data_base). Les deux champs de cette table sont: ID (le numéro de tirage du point) et DIST (distance aux structures paysagères).

J'arrive à créer une table de 100000 lignes et de i colonnes contenant les numéros de distributions aléatoires de i pieds (tempo_ID2).
J'arrive à créer une table de 100000 lignes et de i colonnes contenant i*les distances des 100000 points aléatoires (tempo_dist).

Code : Tout sélectionner

for (i in 1:100)
{
table<-matrix(0,2,i)
table[1,]<-c(1:i)
tempo_table<-matrix(table[1,], length(data_base$ID),ncol(table),byrow=T)
tempo_ID<-matrix(data_base$ID, length(data_base$ID),ncol(table))
tempo_ID2<-floor((tempo_ID/tempo_table)+1)
tempo<-replace(tempo_ID2, tempo_ID2>1000, NA)
tempo_dist<-matrix(data_base$DIST, length(data_base$ID),ncol(table))

Je cherche maintenant à aggréger la colonne i de tempo_dist par la colonne i de tempo_ID2 afin d'obtenir mes 1000 distances moyennes théoriques pour chaque distribution de i pieds.
La fin du code est :

Code : Tout sélectionner

res<-matrix(0, 1000,ncol(table))
res[,i]<- aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x
}

Malheureusement, je n'arrive pas à gérer cette fonction aggregate dans la boucle au sens où j'optiens cette erreur:

Code : Tout sélectionner

Erreur dans res[, i] <- aggregate(tempo_dist[, i], list(tempo[, i]), FUN = mean)$x :
  le nombre d'objets à remplacer n'est pas multiple de la taille du remplacement

J'ai remplacé toutes valeurs >1000 par NA dans tempo afin d'obtenir toujours le même nombre de groupes, mais celà ne semble pas suffire.
Quelqu'un saurait-il comment déjouer ce problème?

J'avais aussi essayé:

Code : Tout sélectionner

for (i in 1:8)
{
table<-matrix(0,2,i)
table[1,]<-c(1:i)
tempo_ID<-matrix(data_base$ID, length(data_base$ID),ncol(table))
tempo_ID2<-floor((tempo_ID/tempo_table)+1)
tempo<-replace(tempo_ID2, tempo_ID2>1000, NA)
tempo2<-cbind(data_base$DIST, tempo)
table[2,i]<-(sort(aggregate(tempo2[,1], list(tempo2[,i+1]),FUN=mean)$x))[50]
}

mais j'obtiens dans "table" des distances de 0, sauf pour la valeur de i la plus forte.

Merci d'avance,

Tino[/code]

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 02 Déc 2008, 14:19

Bonjour,

C'est assez difficile de voir ou se situe le problème sans pouvoir reproduire chaque étape.

Est-ce que le problème ne viendrait pas du fait que tu déclares res comme une matrice avec une ligne et 1000 colonnes alors que tu essaies de stocker 1000 valeur une seule colonne ?

Code : Tout sélectionner

res<-matrix(0, 1000,ncol(table))
res[,i]<- aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x

# ne faudrait-il pas plutôt faire :
res[i,]<- aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x


Maxime

Quentin Lemouland
Messages : 27
Enregistré le : 03 Déc 2007, 07:28

Messagepar Quentin Lemouland » 02 Déc 2008, 14:38

Bonjour Maxime,
Si je remplace par ton code,
j'obtiens l'erreur suivante:

Code : Tout sélectionner

Erreur dans res[i, ] <- aggregate(tempo_dist[, i], list(tempo[, i]), FUN = mean)$x :
  nombre d'indices incorrect sur la matrice


Je ne voie pas d'où celà peut venir.
Sinon j'ai finalement réussi par un moyen détourné en créant une fonction:

Code : Tout sélectionner

p_spatial<-function(i)
{
tempo_ID<-floor((data_base$ID/i)+1)
tempo<-replace(tempo_ID, tempo_ID>1000, NA)
tempo2<-cbind(data_base$DIST, tempo)
dist_p_value<-(sort(aggregate(tempo2[,1], list(tempo2[,2]),FUN=mean)$x))[50]
dist_p_value
}
Dist_seuil<-numeric(100)
for (j in 1:100)
{
Dist_seuil[j]<-p_spatial(j)
}
nb_pieds<-c(1:100)
plot(Dist_seuil~ nb_pieds)



Merci de ton aide,

Tino

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 02 Déc 2008, 15:14

Re,

excuse j'ai lu trop vite ton code ... Le problème ne semble pas venir de la ... Est-ce que tu as fait afficher la longueur de : aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x, si elle n'est pas égale à 1000 alors ça ne marchera pas ...

Maxime

Quentin Lemouland
Messages : 27
Enregistré le : 03 Déc 2007, 07:28

Messagepar Quentin Lemouland » 02 Déc 2008, 15:53

Re,


Vu que j'ai écrit:

Code : Tout sélectionner

tempo<-replace(tempo_ID2, tempo_ID2>1000, NA)


la longueur de : aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x fait normalement 1000 (jusqu'à i=100 vu qu'il y à 100000 points)

Je viens de réessayer, je n'ai plus d'erreur???
Par contre j'ai toujours le même problème:

Code : Tout sélectionner

for (i in 1:6)
{
table<-matrix(0,2,i)
table[1,]<-c(1:i)
tempo_table<-matrix(table[1,], length(data_base$ID),ncol(table),byrow=T)
tempo_ID<-matrix(data_base$ID, length(data_base$ID),ncol(table))
tempo_ID2<-floor((tempo_ID/tempo_table)+1)
tempo<-replace(tempo_ID2, tempo_ID2>1000, NA)
tempo_dist<-matrix(data_base$DIST, length(data_base$ID),ncol(table))
res<-matrix(0, 1000,ncol(table))
res[,i]<- aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x
}

en sortie:

Code : Tout sélectionner

       [,1] [,2] [,3] [,4] [,5]        [,6]
   [1,]    0    0    0    0    0  3.83500000
   [2,]    0    0    0    0    0  7.57666667
   [3,]    0    0    0    0    0  2.77333333
   [4,]    0    0    0    0    0  1.58000000
   [5,]    0    0    0    0    0 14.51833333
   [6,]    0    0    0    0    0  3.50333333
   [7,]    0    0    0    0    0 11.90666667
   [8,]    0    0    0    0    0  6.55666667

je n'ai que la dernière valeur de i prise en compte???

Tino

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 02 Déc 2008, 16:01

Re,

c'est normale puisque dans chaque boucle tu recres res donc tu l'écrase a chaque nouvelle boucle. Il faut que tu la définisse avant ta boucle :

Code : Tout sélectionner

res<-matrix(0, 1000,6)
for (i in 1:6)
{
table<-matrix(0,2,i)
table[1,]<-c(1:i)
tempo_table<-matrix(table[1,], length(data_base$ID),ncol(table),byrow=T)
tempo_ID<-matrix(data_base$ID, length(data_base$ID),ncol(table))
tempo_ID2<-floor((tempo_ID/tempo_table)+1)
tempo<-replace(tempo_ID2, tempo_ID2>1000, NA)
tempo_dist<-matrix(data_base$DIST, length(data_base$ID),ncol(table))
res[,i]<- aggregate(tempo_dist[,i], list(tempo[,i]),FUN=mean)$x
}


Maxime

Quentin Lemouland
Messages : 27
Enregistré le : 03 Déc 2007, 07:28

Messagepar Quentin Lemouland » 02 Déc 2008, 16:25

Parfait,
c'était bien cela!

Encore milles Merci Maxime,
Toujours la solution.

Tino.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Eric Wajnberg et 1 invité