Une matrice de taille énorme

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

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 16 Juil 2008, 15:42

Bien bien. Je vais donc essayer cela demain. Merci aussi pour la fonction sample() (en plus, je la connaissais déjà, mais l'avais oubliée).

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 17 Juil 2008, 07:35

Pour la RAM, c'est possible de créer de la mémoire virtuelle, non? De la mémoire que l'ordi considère comme de la RAM? Cela permettrait d'arranger peut-être une partie de mes problèmes?

(Ah, et puis sinon la fonction sample() fonctionne bien pour les vecteurs, mais pas pour les matrices, en effet, au lieu de me sélectionner plusieurs lignes, elle sélectionne des éléments de la matrice. Je n'ai plus qu'à regarder dans le package sampling voir s'il y a quelque chose d'intéressant. Cela dit, la fonction sample(), si je l'incorpore dans mon programme créé de toutes pièces, me permettra d'éviter de prendre deux fois la même ligne, c'est toujours cela de gagné.)

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

Messagepar Logez Maxime » 17 Juil 2008, 07:44

Bonjour,

si tu veux travailler sur les lignes de ta matrice il n'y a qu'a echantilloné les numéros des lignes au lieu des valeurs elles mêmes :

Code : Tout sélectionner

x <- matrix(rnorm(100),10)
y <- x[sample(1:nrow(y),3),]

Maxime

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 17 Juil 2008, 08:01

Ah mais oui, ce n'est pas bête du tout, je n'y avais même pas pensé. Cela marche très bien. Je vais compléter par un replace=FALSE pour éviter les doublons. Je pense de plus que ce genre de fonction préprogrammée doit tourner plus vite qu'une fonction que l'on programme nous même. Merci bien.

(En passant, voici ma fonction créée:

Code : Tout sélectionner

selectsousmatrice=function(n){
a=round(1501183*runif(1)+1)
matriceresult=matrice2[a,]
matriceresult=as.matrix(matriceresult)
vecrando=round(1501183*runif(n-1)+1)
for (i in 1 :n-1){
matriceresult=rbind(matriceresult,matrice2[vecrando[i],])
}
return(matriceresult)
}
)

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 17 Juil 2008, 08:23

Miraculeux! Fantastique! Extraordinaire! J'ai enfin des résultats d'une régression linéaire généralisée avec un échantillon de 100000 lignes!
(Excusez cette explosion de joie sans doute puérile, mais quand cela fait depuis deux semaines que je m'efforce d'avoir un résultat et que j'y arrive enfin, je tenais à partager mon bonheur, surtout avec ceux qui y ont contribué).

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 17 Juil 2008, 09:31

Code : Tout sélectionner

ff=matrice2[,7]~matrice2[,5]+matrice2[,22]+matrice2[,23]+matrice2[,28]
a=bigglm(ff,data=matrice2,family=binomial())


Erreur : impossible d'allouer un vecteur de taille 57.3 Mo


Je n'ai plus qu'à demander à ce que l'on m'octroie de la mémoire virtuelle, considérée comme de la RAM (parce que je ne vois vraiment pas pourquoi R ne serait pas capable de créer un truc de 57.3 Mo, surtout quand j'ai mis la memory.limit à 4000). Il y a quand même un truc qui m'intrigue quelque peu, c'est l'endroit de stockage des objets en R. Je viens de rechercher tous les fichiers du C contenant "tablezn" (nom d'un objet de R enregistré), aucun résultat.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 17 Juil 2008, 15:28

Savez-vous où sont stockés les objets en R? j'ai scanné tous les fichiers du poste de travail, en cherchant à l'intérieur le nom d'un objet que j'ai enregistré, je n'ai aucun résultat! Curieux, non?

Bon, sinon, malgré le package biglm, impossible de faire une modélisation linéaire sur matrice2. Je me suis décidé à refiler le problème au service dépannage de l'entreprise, avec la suggestion d'augmenter la mémoire virtuelle.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 18 Juil 2008, 20:51

Le dépannage est un peu dépassé par les événements. On m'a mis une mémoire virtuelle variable (le système choisit ce qu'il veut affecter), et pourtant, l'erreur est encore là. En attendant, je travaille sur des sous-matrices.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 19 Juil 2008, 07:06

Benoît Lamy a écrit :Savez-vous où sont stockés les objets en R? j'ai scanné tous les fichiers du poste de travail, en cherchant à l'intérieur le nom d'un objet que j'ai enregistré, je n'ai aucun résultat! Curieux, non?


Non. Voir le manuel "An introduction to R" (livré avec R), page 5, section 1.11 Data permanency and removing objects

Les objets ne sont donc pas écrits sur le disque dur tant que l'espace de travail n'est pas sauvegardé (fichier .RData). Dans ce fichier, les objets ne sont pas (facilement?) accessibles. Si vous voulez avoir une représentation d'un objet lisible par un programme externe, voir le manuel "R Data Import/Export" livré également avec R: write.table, dput, sink, cat... ou des solutions plus sophistiquées pour écrire dans des tableurs ou des bases de données.

Renaud

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 21 Juil 2008, 10:02

Merci pour la référence, je vais lire tout cela de ce pas.

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 21 Juil 2008, 10:17

C'est quand même très étrange.
Je lance une opération, erreur, impossible d'allouer, etc.
Agacé, je relance la même opération sans avoir touché entre temps au memory.size ou à la mémoire virtuelle, et cela fonctionne.
Je suis allé voir dans les poste de travail: la mémoire virtuelle de 4020 n'avait pas bougé. Moi, tout cela me laisse perplexe.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 21 Juil 2008, 10:38

Voir aussi ?gc. En principe, on n'a pas à y toucher mais on ne sait jamais, sur des pbs "hors norme".

Renaud

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 21 Juil 2008, 15:33

Oui, effectivement, il y a gc, je l'ai lancé plusieurs fois, sans résultat notable. Quand l'aide indique "reset logical; if TRUE the values for maximum space used are reset to the current values. ", vous savez si les valeurs pour l'espace maximum, cela désigne le memory.size()?

J'ai commencé à créer des modèles de Poisson avec des échantillons de seulement 15000 lignes (pas possible de faire plus, cela fait seulement un pourcent de la matrice), et évidemment, j'arrive à des variables significatives différentes, des coefs positifs chez l'un et négatifs chez l'autre, des valeurs différentes.... Gros, gros, gros soupirs.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 21 Juil 2008, 16:09

Non, je ne sais pas. Voir dans l'aide et dans les archives de R-Help.

Autre chose: je revois un de vos posts précédents:

Code : Tout sélectionner

ff=matrice2[,7]~matrice2[,5]+matrice2[,22]+matrice2[,23]+matrice2[,28]
a=bigglm(ff,data=matrice2,family=binomial())


Ce n'est pas comme ça que bigglm doit être utilisé: bien regarder l'exemple qui est fourni dans l'aide. Il s'agit de sélectionner des échantillons de lignes du grand tableau, faire des régressions sur chaque sous-tableau, puis de faire la synthèse des résultats:

Code : Tout sélectionner

data(trees)
ff <- log(Volume) ~ log(Girth) + log(Height)
a <- bigglm(ff, data = trees, chunksize = 10, sandwich = TRUE)
summary(a)


Bien noter que la formule fait référence à des noms de variables, non aux variables elles-même.

Dans votre cas:

Code : Tout sélectionner

ff <- matrice2[ ,7] ~ matrice2[ ,5] + matrice2[ ,22] + matrice2[ ,23] + matrice2[ ,28]


vous attaquez directement la matrice dans la formule. Je ne sais pas comment R peut se débrouiller avec ça: miraculeux que ça ne plante pas. En tout cas, il est fort probable que dans l'étape bigglm, vous essayez d'ajuster le modèle sur toutes les données, et non des chunks de 5000 lignes (valeur par défaut).

La bonne pratique est donnée dans l'exemple suivant de l'aide:

Code : Tout sélectionner

make.data <- function(urlname, chunksize, ...){
      conn <- NULL
     function(reset = FALSE){
     if(reset){
       if(!is.null(conn)) close(conn)
       conn <<- url(urlname, open = "r")
     } else{
       rval <- read.table(conn, nrows = chunksize, ...)
       if (nrow(rval) == 0) {
            close(conn)
            conn <<- NULL
            rval <- NULL
       }
       return(rval)
     }
  }
}

airpoll <- make.data("http://faculty.washington.edu/tlumley/NO2.dat",
        chunksize = 150,
        col.names = c("logno2","logcars","temp","windsp",
                    "tempgrad", "winddir", "hour", "day"))


Noter que des noms de colonnes sont donnés, ce qui permet d'écrire ensuite la formule en faisant référence aux noms:

Code : Tout sélectionner

b <- bigglm(exp(logno2) ~ logcars + temp + windsp,
         data = airpoll, family = Gamma(log), start = c(2, 0, 0, 0), maxit = 10)
summary(b)


Je ne vois pas pourquoi ça ne marcherait pas chez vous si vous respectez cette procédure.

Renaud

Benoît Lamy
Messages : 75
Enregistré le : 09 Juil 2008, 07:57

Messagepar Benoît Lamy » 22 Juil 2008, 07:54

Merci à vous, je regarde cela tout de suite (en fait, c'est que mon niveau d'anglais est assez mauvais, c'est pour cela que parfois je ne comprends pas certaines pages d'aide).


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron