Poiché la versione 3 R supporta i vettori lunghi. Un vettore lungo viene indicizzato da double
. Un vettore lungo può essere una base per una matrice o un array di dimensioni superiori a 2 purché ogni dimensione sia sufficientemente piccola per essere indicizzabile con uno integer
. I vettori lunghi non possono essere passati al codice nativo tramite .C
e .Fortran
. Il messaggio di errore che stai ricevendo è perché un vettore lungo viene passato tramite .C
.
I vettori lunghi possono essere passati tramite .Call
. Quindi, finché il codice nativo di glmnet potrebbe supportare i vettori lunghi (indici a 64 bit) o potrebbe essere modificato/compilato per supportarlo, uno solo dovrebbe modificare l'interfaccia tra R e il codice nativo di glmnet. Puoi farlo manualmente in C e c'è anche un nuovo pacchetto chiamato dotCall64
per questa attività. Parte della modifica dell'interfaccia sta decidendo quando copiare gli argomenti - .C/.Fortran fa una copia preventiva, ma non si vuole farlo inutilmente con strutture di dati di grandi dimensioni.
Penso che la difficoltà di cambiare il codice nativo di glmnet per supportare indici a 64 bit dipende dal codice reale (che ho solo guardato ma non ho mai lavorato). È facile convertire tutti i numeri interi (o in modo esplicito o implicitamente interi a 32 bit) nel codice Fortran a 64 bit. I problemi arrivano quando alcuni numeri interi devono rimanere a 32 bit, e ciò avverrà per es. per i vettori interi passati da/a codice R, perché R usa numeri interi a 32 bit (anche nei vettori lunghi in effetti). Ci sono questi vettori interi passati in glmnet. Quanto è difficile la modifica dipende da quanto è pulito il codice Fortran originale (ad esempio se utilizza variabili intere separate per l'indicizzazione e l'accesso ai valori di matrici di interi, ecc.).
Implementazioni sperimentali di sottoinsiemi di R, come Riposte, non aiuteranno.
fonte
2016-10-19 10:11:12
Durante il codice, si esegue un subset della matrice? Potrei sbagliarmi ma non puoi eseguire una subsetting della matrice se la matrice ha più di 36 miliardi di elementi. In tal caso devi sottoporre a matrice la matrice come se fosse un enorme vettore atomico (che in effetti è dato dal fatto che una matrice è solo un vecotr con un attributo dimesion). – SabDeM
Nel mio codice sto usando un file bigmatrix supportato per evitare questi problemi, ma quando eseguo glmnet devo passarlo come una matrice R come questa: 'theMatrix [,]'. – Danny
Ciao Danny. Il mio commento non è direttamente correlato alla domanda, ma mb aiuterà. Dai un'occhiata al pacchetto pirls di Michael Kane - https://github.com/kaneplusplus/pirls. Mb questo risolutore funziona con i vettori lunghi. –