modificare lm o la funzione loess di utilizzarlo all'interno di geom_smooth ggplot2

StackOverflow https://stackoverflow.com/questions/2370648

  •  24-09-2019
  •  | 
  •  

Domanda

ho bisogno di modificare la lm (o eventualmente loess) Funzione di modo che io possa utilizzarlo in geom_smooth di ggplot2 (o stat_smooth).

Ad esempio, questo è il modo stat_smooth viene utilizzato normalmente:

> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`

vorrei definire una funzione lm2 personalizzato da utilizzare come valore per il parametro method in stat_smooth, in modo da poter personalizzare il suo comportamento.

> lm2 <- function(formula, data, ...)
  {
      print(head(data))
      return(lm(formula, data, ...))
  }
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')

Si noti che ho usato come parametro di method='lm2' in stat_smooth. Quando eseguo questo codice un l'errore:

  

Errore in eval (espressione, Envir, enclos): 'nthcdr' ha bisogno di un elenco di CDR giù

Il che non capisco molto bene. Il metodo lm2 funziona molto bene quando eseguito al di fuori della stat_smooth. Ho giocato con questo un po 'e ho avuto diversi tipi di errore, ma dal momento che non trovo a mio agio con gli strumenti di debug di R è difficile per me per eseguire il debug di loro. Onestamente, non capisco che cosa devo mettere dentro la chiamata return().

È stato utile?

Soluzione

C'è qualche stranezza nel usando ... come argomento in una chiamata di funzione che non ho pienamente capito (che ha qualcosa a che fare con ... essendo un oggetto elenco-tipo).

Ecco una versione che funziona prendendo la chiamata di funzione come un oggetto, impostare la funzione di essere chiamati a lm e poi valutare la chiamata nel contesto della nostra chiamante. Il risultato di questa valutazione è il nostro valore di ritorno (in R il valore dell'ultima espressione di una funzione è il valore restituito, quindi non abbiamo bisogno di un return esplicito).

foo <- function(formula,data,...){
   print(head(data))
   x<-match.call()
   x[[1]]<-quote(lm)
   eval.parent(x)
}

Se si desidera aggiungere argomenti alla chiamata lm, si può fare in questo modo:

x$na.action <- 'na.exclude'

Se si vuole far cadere argomenti per pippo prima di chiamare lm, si può fare in questo modo

x$useless <- NULL

A proposito, geom_smooth e stat_smooth passare alcun argomento in più per la funzione di smoothing, quindi non è necessario creare una funzione della propria, se avete solo bisogno di impostare alcuni argomenti extra

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top