【问题标题】:Strange abline behaviour奇怪的行为
【发布时间】:2026-02-24 14:30:02
【问题描述】:

我目前正在尝试绘制价格价差的时间序列图,然后添加带有回归的 abline。目前这只是一个 AR(1),因为我想在开始之前得到情节。

数据来自 .XLS 并在 OpenOffice 中这样组织

Date - Price1 - Price 2 - NA.(Empty) 
01.01.1982 - 1.56 - 2.53 -  
[...]

我正在阅读这篇文章

library(xlsx)
library(AER)
x<-read.xlsx("data.xlsx",1)

然后我像这样填充空列

x$NA.=(x$Price1-x$Price2)

所以我现在在内存中有一个生成这个 head() 的表

       Date Price1 Price2 NA.
1 1987-08-28  18.30  19.44 1.24
2 1987-08-31  18.65  19.75 1.12

(在日期之前有一个索引列,我真的不需要它,因为我按日期绘制但它在那里)

然后我做

plot(x$Date,x$NA.)

我得到了正确的情节。我已经稍微修改了该绘图命令以获得正确的网格、轴和日期和线条等,但即使使用上面的简单绘图版本,我的问题也仍然存在,所以问题不在于我的编辑。

问题如下:

如果我现在尝试绘制一条线

abline(a=1,b=1,col="blue")

它不起作用。该命令通过,但没有显示一行。然而:

abline(a=1,b=0,col="blue")

按预期工作并显示蓝色水平线。

我遇到的问题是我想将一个回归对象输入到图中,例如像这样

SPRC=zoo(x$NA.,x$Date)
SPRC2=lag(SPRC, -1)
SPRC=SPRC[2:length(SPRC)]
LMO<-lm(SPRC ~ SPRC2)
abline(a=LMO$coefficients[2],b=LMO$coefficients[1],col="red")

我想做的是一个简单的 AR 来测试。回归按预期工作,但 abline 不产生输出。

我也尝试过不带变量的 abline - 它仅在 b=0 时才有效。我也尝试做一个

plot(SPRC)

然后是任何类型的 abline,但要么没有出现,要么变成垂直线 (!)。只有当 b=0 时它才会变成一条水平线。

我想这与数据对象或输入有关,但我真的不知道为什么它不起作用。我还在 Date 对象上尝试了 as.Date ,但这并没有改变任何东西。所有其他绘图命令似乎都可以工作,例如添加自定义网格、par、定位器文本、轴等。如果我启动一个干净的 R 会话并且几乎只输入上面的代码,就会出现问题。 我还尝试切换回归变量、a 和 b 值或绘图变量的顺序。还是不行

你能想象可能是什么问题吗?

编辑: 如果 typeof(),我刚刚检查了数据类型。 typeof x 是“list”,其他都是“double”,即使我做了x$Date&lt;-as.Date(x$Date,"%d.%m.%Y")

编辑2: 我继续将文件保存为 csv 并使用 read.csv 读取 然后我做了

plot(x$Price1)

abline(a=40,b=1)

它所做的只是产生一条顺时针略微转动的垂直(!)线。 我的R坏了吗?

(我意识到价格的比例是关闭的 - 点差约为 0。但即使 a=40,线也是相同的)

【问题讨论】:

  • 使用指定您正在使用的语言/技术的标签。这将帮助其他人找到您的问题。
  • 一个可重现的例子(tinyurl.com/reproducible-000)会有很大帮助。我怀疑您在使用 Dates 的隐式单位时遇到了麻烦,它可能 (??) 以秒为单位?
  • abline(a=40, b=1) 表示您正在画线y = 40x + 1(在我看来)确实是您显示的图表上绘制的线。
  • @plannapus:是的,我对 a 或 b 赋予什么价值并不重要。我只是将 40 放入 a 中,认为是截距,以明确这不是图形区域外的截距的问题。 abline(1,1) 将产生几乎相同的图形
  • @user1680443 正如我在下面的答案中所写,我认为问题只是使用日期时 x 轴的值。

标签: r plot line time-series


【解决方案1】:
x<- read.table(text="Date Price1 Price2 NA.
 28.08.1987  18.30  19.44 1.24
 31.08.1987  18.65  19.75 1.12", sep="", header=TRUE)
x$Date <- as.Date(x$Date, "%d.%m.%Y")

plot(x$Date, x$NA.)

我的语言环境设置是法语,所以 x 标签代表星期五到星期一。

# If we're trying to find the actual coordinates of some points on the plot
# here is what we find:
locator() 
$x
[1] 6449.495 6448.035 6450.967

$y
[1] 1.182379 1.186610 1.182908

# The x axis is running from 6448 to 6451 and here is the reason:

x$Date # Here is your date vector
[1] "1987-08-28" "1987-08-31"
as.numeric(x$Date) # And here it is converted in numerics
[1] 6448 6451 # Hence the values found on the plot with locator.

# The default origin for dates is the first of January, 1970
# 6448 is the number of days from that date to the 28th of August 1987.

# But you can still use regression tools:
lm(NA.~Date, data=x)->lmx
abline(lmx)  # YOu don't actually need to break your lm object into its coefficients, abline recognize lm objects.

# And the same works with package zoo
library(zoo)
x<- read.table(text="Date Price1 Price2 NA.
 28.08.1987  18.30  19.44 1.24
 31.08.1987  18.65  19.77 1.12
 01.09.1987  18.65  19.75 1.10", sep="", header=TRUE)
x$Date <- as.Date(x$Date, "%d.%m.%Y")
SPRC<-zoo(x$NA.,x$Date)
SPRC2<-lag(SPRC, -1)
SPRC<-SPRC[2:length(SPRC)]
LMO<-lm(SPRC ~ SPRC2)
plot(SPRC)
abline(LMO)

【讨论】:

  • 我会看看你的例子。我可以这么说:使用 read.table 命令,一切似乎都可以正常工作(例如,如果我粘贴您的示例,它们会很好用)。我将调查为什么它不适用于 XLS 并报告回来。到目前为止,谢谢!
  • 使用定位器并手动放入行(),它确实产生了一条线。但是, abline(regression) 不适用于我的数据集。没有线路出现。回归的截距约为 31,斜率约为 -0.01。我将尝试手动将其放入行()中。编辑: AAAND 有效。好的,如果我使用带有手动日期的行,它就可以工作。代码是lines( c(8100,15700), c(intercept,intercept+(slope*(15700-8100))) )不知道为什么abline()不起作用?
  • 没有看到你的实际数据,我真的不知道为什么它不起作用。但我很高兴你成功了。
最近更新 更多