2012-04-05 13 views
12

Utilizzando R, vorrei tracciare una relazione lineare tra due variabili, ma vorrei che la linea adattata fosse presente solo all'interno dell'intervallo dei dati.Tracciare la linea all'interno di un determinato intervallo R

Ad esempio, se si dispone del seguente codice, desidero che la riga esista solo dai valori x e y di 1:10 (con i parametri predefiniti questa linea si estende oltre l'intervallo di punti dati).

x <- 1:10 
y <- 1:10 
plot(x,y) 
abline(lm(y~x)) 

risposta

13

Anziché utilizzare abline(), (a) salvare il modello adattato, (b) utilizzare predict.lm() per trovare i valori y montati corrispondenti ad x = 1 ed x = 10, e poi (c) utilizzare lines() a aggiungi una linea tra i due punti:

f <- lm(y~x) 
X <- c(1, 10) 
Y <- predict(f, newdata=data.frame(x=X)) 

plot(x,y) 
lines(x=X, y=Y) 
8

È possibile farlo utilizzando la previsione. (? Vedi prevedere)

È possibile prevedere su valori specifici di x

x<-1:10 
y<-1:10 
plot(x,y) 
new <- data.frame(x = seq(1, 5, 0.5)) 
lines(new$x, predict(lm(y~x), new)) 

enter image description here

17

Oltre a utilizzare predict con lines o segments è anche possibile utilizzare la funzione clip con abline:

x <- 1:10 
y <- 1:10 
plot(x,y) 
clip(1,10, -100, 100) 
abline(lm(y~x)) 
+3

+1, perché funziona con qualsiasi linea, anche abline(), senza utilizzare l'hack con previsione(). In questo modo, ad esempio, è possibile anche ritagliare le abline che si estendono fino ai margini di un grafico, ma solo su un lato, ad es. a destra, non a sinistra. – pfifas

2

La trama l ibrary ha la funzione ablineclip() proprio per questo:

x <- 1:10 
y <- 1:10 
plot(x,y) 
ablineclip(lm(y~x),x1=1,x2=5) 
0

Un'alternativa è quella di utilizzare la funzione segments (doc here).

Supponiamo di aver stimato la linea e di aver ottenuto un'intercetta di a e una pendenza di b. Pertanto, la tua funzione adattata è y = a + bx.

Ora, si supponga di voler mostrare la linea per x tra x0 e x1. Quindi, il codice seguente traccia la linea:

# inputs 

a <- 0.5 
b <- 2 

x0 <- 1 
x1 <- 5 

# graph 

plot(c(0,5), c(0,5), type = "n", xlab = "", ylab = "", bty='l') 
segments(x0, a+b*x0, x1, a+b*x1) 

Basta sostituire i valori dia, b, x0, x1con quelli della vostra scelta.

enter image description here


Per quelli come me che sono venuti a questa domanda voler tracciare una linea per una coppia arbitraria di numeri (e non quelli che si adattano un dato di regressione), il seguente codice è quello che ti serve :

plot(c(0,5), c(0,5), type = "n", xlab = "", ylab = "", bty='l') 
segments(x0, yo, x1, y1) 

Basta sostituire i valori dix0, y0, x1, y1con quelli della vostra scelta.