[R] date in plot, can't add regression line

Norbert Skalski Norbert.Skalski at ronin-capital.com
Wed Aug 29 14:46:23 CEST 2012


Thanks for your suggestions,

The solution was as proposed by Mr. Nordlund,  I had to convert the timestamps again using as.POSIXct()  I will have to remember that anytime I do any kind of filtering/subselection of dates to reconvert them.  Lesson learned.

Also thank you for the dput() suggestions for data, another tip I shall not forget.  This question is now closed.

Thanks!

-----Original Message-----
From: Norbert Skalski 
Sent: Tuesday, August 28, 2012 11:49 AM
To: 'r-help at r-project.org'
Subject: date in plot, can't add regression line

Hello all,

I have been using R for about 3 weeks and I am frustrated by a problem.  I have read R in a nutshell, scoured the internet for help but I either am not understanding examples or am missing something completely basic.  Here is the problem:

I want to plot data that contains dates on the x axis.  Then I want to fit a line to the data.  I have been unable to do it.

This is an example of the data (in a dataframe called "tradeflavorbyday"), 40 lines of it (I'm sorry it's not in a runnable form, not sure how to get that from R) :
     tradeflavor  timestamp   x
1              1 2009-01-22   1
2              2 2009-01-22   1
3              1 2009-01-23   1
4              1 2009-01-27  54
5              1 2009-01-28 105
6              2 2009-01-28   2
7             16 2009-01-28   2
8              1 2009-01-29  71
9             16 2009-01-29   2
10             1 2009-01-30  42
11             1 2009-02-02  19
12            16 2009-02-02   2
13             1 2009-02-03  36
14             4 2009-02-03   2
15             8 2009-02-03   3
16             1 2009-02-04  73
17             8 2009-02-04  12
18            16 2009-02-04   7
19             1 2009-02-05  53
20             8 2009-02-05   6
21            16 2009-02-05   9
22             1 2009-02-06  38
23             4 2009-02-06   6
24             8 2009-02-06   2
25            16 2009-02-06   3
26             1 2009-02-09  42
27             2 2009-02-09   2
28             4 2009-02-09   1
29             8 2009-02-09   2
30             1 2009-02-10  87
31             4 2009-02-10   2
32             8 2009-02-10   4
33            16 2009-02-10   3
34             1 2009-02-11  55
35             2 2009-02-11   6
36             4 2009-02-11   4
37             8 2009-02-11   2
38            16 2009-02-11   8
39             1 2009-02-12 153
40             2 2009-02-12   6


The plot displays the x column as the yaxis and the date as the x axis, grouped by the tradetype column.
The timestamp column:
> class(tradeflavorbyday$timestamp)
[1] "POSIXlt" "POSIXt"

So in this case I want to plot tradetype 1 (method 1):

xdates <- tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1]
ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]

plot(xdates, ydata, col="black", xlab="Dates", ylab="Count")

Up to here it works great.

Now a abline through lm:

xylm <- lm(ydata~xdates)   <------ this fails, can't do dates as below
abline(xylm, col="black")

> lm(ydata~xdates)
Error in model.frame.default(formula = ydata ~ xdates, drop.unused.levels = TRUE) : 
  invalid type (list) for variable 'xdates'



So I try this instead (method 2):
xdata <- 1:length(tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1])
ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]

xylm <- lm(ydata~xdata)   <------ now this works, great
abline(xylm, col="black")

The problem now is that I can't get the dates onto the xaxis.  I have tried turning off the axis using xaxt="n" and reploting using the axis.POSIXct() call but it does not want to display the dates:

dateseq = seq(xdates[1], xdates[length(xdates)], by="month")
axis.POSIXct(1, at=dateseq, format="%Y\n%b")




I have tried combining both approaches by plotting dates and trying to fit the line using method 2:
xdates <- tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1]
xdata <- 1:length(tradeflavorbyday$timestamp[tradeflavorbyday$tradeflavor == 1])
ydata <- tradeflavorbyday$x[tradeflavorbyday$tradeflavor == 1]

plot(xdates, ydata, col="black", xlab="Dates", ylab="Count", xaxt="n")
dateseq = seq(xdates[1], xdates[length(xdates)], by="month")
axis.POSIXct(1, at=dateseq, format="%Y\n%b")

xylm <- lm(ydata~xdata)  <- works
abline(xylm, col="black")  <- does nothing

In this case the call to lm and abline "works" but nothing is drawn.  Confused I plugged in the coefficients manually (I have complete data, so they will be different than the example data I pasted):

> lm(ydata~xdata)

Call:
lm(formula = ydata ~ xdata)

Coefficients:
(Intercept)        xdata  
    6.11491     -0.02577  

Abline(6.11491, -0.02577)  <- call worked, but nothing shown

Just by chance I added many 0 to flatten out the slope:

Abline(6.11491, -0. 0000000002577)  <- call worked and a horizontal line appeared?????

So I took off a 0:

Abline(6.11491, -0. 000000002577)  <- the line moved significantly down

So I took off another 0:

Abline(6.11491, -0. 00000002577)   <- line disappeared

I guess the slope causes it to go vertical and disappear of the graph.

I have no idea how to solve my issue.  If anyone can see my basic idiotic error please point it out, or maybe you have another suggestion, I will gladly try it.

Thanks for your help!!




More information about the R-help mailing list