2014-09-30 12 views
5

Vorrei creare una classe S4 dotata di slot che possano contenere modelli lineari robusti.Come posso creare uno slot in una classe S4 per modelli lineari robusti?

I modelli lineari robusti sono un tipo di modello lineare dal pacchetto MASS. Portano tutte le informazioni di un modello lineare e un po 'di più.

library(MASS) 
x <- 1:5 
y <- 1:5 
mylm <- lm(x~y) 
myrlm <- rlm(x~y) 

Qui è la mia classe:

.MyClass <- setClass("MyClass", list(a="lm", id="numeric")) 

Anche se .MyClass(a=mylm, id=1) produce l'oggetto previsto, l'inizializzazione di un oggetto con un rlm fallisce:

> .MyClass(a=myrlm, id=1) 
Error in validObject(.Object) : 
    invalid class “MyClass” object: 1: invalid object for slot "a" in class "MyClass": got class "rlm", should be or extend class "lm" 
invalid class “MyClass” object: 2: invalid object for slot "a" in class "MyClass": got class "lm", should be or extend class "lm" 

avrei pensato che, dal momento is(myrlm, "lm") rendimenti TRUE non ci sarebbe stato un problema e l'oggetto potrebbe entrare nello slot. Inoltre, poiché mi sta dicendo che ho creato un oggetto non valido due volte, perché il secondo che dice che lm non è esso stesso? È perché lm è una classe virtuale?

Ho provato a impostare a="list" nella rappresentazione (dal lm e rlm sono entrambe le liste), ma che produce un errore simile. Lo slot ha bisogno di un diverso tipo di classe? Ho anche provato a impostare a="rlm", ma rlm non è una classe definita.

+1

ottima domanda. Sospetto che tu stia cadendo in un inferno di incompatibilità S3/S4, ma spero (per il tuo bene) che tu non lo sia. Potresti (???) provare a creare una classe S4 che comprenda/avvolga la classe "rlm" di S3 ...? –

risposta

1

Il problema sembra essere il fatto che gli oggetti rlm hanno due classi S3. Suggerisco, come soluzione, di definire un costruttore e modificare la classe degli slot prima di creare l'oggetto. Qualcosa in questo senso:

library(MASS) 
    x <- 1:5 
    y <- 1:5 
    mylm <- lm(x~y) 
    myrlm <- rlm(x~y) 
    .MyClass <- setClass("MyClass", list(a="lm", id="numeric")) 
    MyClass<-function(a,id) { 
    if (!is(a,"lm")) stop("error") 
    class(a)<-"lm" 
    new("MyClass",a=a,id=id) 
    } 
    MyClass(myrlm,1) 
+0

Bello! Immagino poiché 'lm' è una classe virtuale, non c'è davvero alcuna convalida dell'oggetto. Sembra che funzioni per qualsiasi oggetto di tipo elenco e classe virtuale. –