2012-10-14 22 views
6

In Excel, è piuttosto facile adattare una linea di tendenza logaritmica di un determinato insieme di linee di tendenza. Basta fare clic su Aggiungi linea di tendenza e quindi selezionare "Logaritmico". Passando a R per più potenza, sono un po 'perso su quale funzione si dovrebbe usare per generare questo.aggiungi una linea di regressione logaritmica a un grafico a dispersione (confronto con Excel)

Per generare il grafico, ho utilizzato ggplot2 con il seguente codice.

ggplot(data, aes(horizon, success)) + geom_line() + geom_area(alpha=0.3)+ 
    stat_smooth(method='loess') 

Ma il codice fa raccordo regressione polinomiale locale che si basa su una media fuori numerose piccole regressioni lineari. La mia domanda è se esiste una linea di tendenza del log simile in R utilizzata in Excel.

Modifica: un'alternativa che sto cercando è ottenere un'equazione di registro in forma y = (c * ln (x)) + b; c'è una funzione coef() per ottenere 'c' e 'b'?

Edit2: Poiché ho più reputazione, ora posso pubblicare un po 'di più su ciò che sto cercando di fare. Che il mio dati sia:

0.599885189,0.588404133,0.577784156,0.567164179,0.556257176,0.545350172,0.535112897, 
0.52449292,0.51540375,0.507271336,0.499904325,0.498851894,0.498851894,0.87, 
0.4964600,0.495885955,0.494068121,0.492154612,0.490145427,0.486892461,0.482395714, 
0.477229238,0.471010333 

I dati di cui sopra sono y punti, mentre gli X-punti sono semplicemente interi da 1: lunghezza (y) in incremento di 1. In Excel: posso semplicemente tracciare questa e aggiungere un linea di tendenza logaritmica e il risultato ottenuto:

enter image description here

Con nero è il registro. In R, come si farebbe con il set di dati sopra?

+1

È possibile prendere il registro dei dati utilizzando la funzione 'log()' e installare i livellatori utilizzando la funzione 'loess()'. Crea una trama dei dati usando 'plot()' e aggiungi linee (levigate) usando 'lines()'. –

+0

è possibile ottenere l'equazione? l'equazione in excel è y = (c * ln (x)) + b – user1234440

risposta

7

Si può facilmente specificare i metodi di smoothing alternativi (come ad esempio lm(), lineari minimi quadrati montaggio) e un'alternativa formula

library(ggplot2) 
g0 <- ggplot(dat, aes(horizon, success)) + geom_line() + geom_area(alpha=0.3) 
g0 + stat_smooth(method="lm",formula=y~log(x),fill="red") 

Le fasce di sicurezza sono incluse automaticamente: ho cambiato il colore per renderle visibili poiché sono molto strette. È possibile utilizzare se=FALSE in stat_smooth per disattivarli.

enter image description here

L'altra risposta che mostra come ottenere i coefficienti:

coef(lm(success~log(horizon),data=dat)) 

posso immaginare si potrebbe prossima voler aggiungere l'equazione al grafico: vedo Adding Regression Line Equation and R2 on graph

+0

C'è qualche ragione per cui hai usato 'geom_area' oltre a' geom_line'? Non sono sicuro che questo faciliti la comprensione della trama – mnel

+0

L'ho riprodotto dall'esempio dell'OP: ho pensato che ce l'avessero lì perché lo volevano, ma immagino sia possibile che l'abbiano appena copiato da un esempio stesso .. . –

1

Sono quasi sicuro che un semplice + scale_y_log10() potrebbe ottenere ciò che volevi. Le statistiche di GGPlot vengono calcolate dopo le trasformazioni, quindi il loess() verrà quindi calcolato sui dati trasformati di log.

10

Io preferisco usare la grafica di base, invece di ggplot2:

#some data with a linear model 
x <- 1:20 
set.seed(1) 
y <- 3*log(x)+5+rnorm(20) 

#plot data 
plot(y~x) 

#fit log model 
fit <- lm(y~log(x)) 
#look at result and statistics 
summary(fit) 
#extract coefficients only 
coef(fit) 

#plot fit with confidence band 
matlines(x=seq(from=1,to=20,length.out=1000), 
     y=predict(fit,newdata=list(x=seq(from=1,to=20,length.out=1000)), 
        interval="confidence")) 

enter image description here

#some data with a non-linear model 
set.seed(1) 
y <- log(0.1*x)+rnorm(20,sd=0.1) 

#plot data 
plot(y~x) 

#fit log model 
fit <- nls(y~log(a*x),start=list(a=0.2)) 
#look at result and statistics 
summary(fit) 

#plot fit 
lines(seq(from=1,to=20,length.out=1000), 
     predict(fit,newdata=list(x=seq(from=1,to=20,length.out=1000)))) 
1

I' Ho appena scritto un blog post here che descrive come abbinare esattamente la curva logaritmica di Excel.Il nocciolo dei centri di avvicinamento attorno alla funzione lm():

# Set x and data.to.fit to the independent and dependent variables 
data.to.fit <- c(0.5998,0.5884,0.5777,0.5671,0.5562,0.5453,0.5351,0.524,0.515,0.5072,0.4999,0.4988,0.4988,0.4973,0.49,0.4958,0.4940,0.4921,0.4901,0.4868,0.4823,0.4772,0.4710) 
x <- c(seq(1, length(data.to.fit))) 
data.set <- data.frame(x, data.to.fit) 

# Perform a logarithmic fit to the data set 
log.fit <- lm(data.to.fit~log(x), data=data.set) 

# Print out the intercept, log(x) parameters, R-squared values, etc. 
summary(log.fit) 

# Plot the original data set 
plot(data.set) 

# Add the log.fit line with confidence intervals 
matlines(predict(log.fit, data.frame(x=x), interval="confidence")) 

Speranza che aiuta.

Problemi correlati