我有股票数据,我已经缩短了R的时间范围,但是当我绘制图表时,图表仍然显示空白值和我删除的日期。我还试图让R读取我的date列作为日期,但是它不起作用。当我尝试运行ACF和线性模型时,我注意到日期存在问题。
> sp<-read.csv(file="~/Desktop/SP500.csv", header=T, sep=",",check.names=FALSE)
> sfshort=sp[1428:2049,]
> plot(sfshort)
> sfshort
Date Value
1428 2005-01-07 1186.19
1429 2005-01-14 1184.52
1430 2005-01-21 1167.87
1431 2005-01-28 1171.36
1432 2005-02-04 1203.03
1433 2005-02-11 1205.30
1434 2005-02-18 1201.59
1435 2005-02-25 1211.37
1436 2005-03-04 1222.12
1437 2005-03-11 1200.08
1438 2005-03-18 1189.65
1439 2005-03-24 1171.42
1440 2005-04-01 1172.92
1441 2005-04-08 1181.20
1442 2005-04-15 1142.62
上面列出了前几点。这是我用来尝试转换日期列的代码。我已经在较旧的项目中使用了此功能,所以我不确定为什么它不起作用。
sfshort <- as.Date(spfshort$Date, "%m/%d/%y")
我的excel文件中的日期被列为MM / DD / YYYY。 这是我运行线性模型时所看到的。
> lm(sfshort$Value~sfshort$Date)
Call:
lm(formula = sfshort$Value ~ sfshort$Date)
Coefficients:
(Intercept) sfshort$Date2005-01-14 sfshort$Date2005-01-21
1186.19 -1.67 -18.32
sfshort$Date2005-01-28 sfshort$Date2005-02-04 sfshort$Date2005-02-11
-14.83 16.84 19.11
答案 0 :(得分:0)
绘图问题是由于“日期”列最有可能属于"factor"
类。如评论中所述,您需要转换为日期,或者甚至最好转换为POSIXlt
。在这里,我建议使用strptime
。 (或者在读取数据时立即执行。)
这是一个小示范。我读了您的示例数据文本,它与read.csv
相似。为了进行比较,我将创建三个数据集sfshort.1
,sfshort.2
,sfshort.3
。
sfshort.1 <- read.table(text=
" Date Value
1428 2005-01-07 1186.19
1429 2005-01-14 1184.52
1430 2005-01-21 1167.87
1431 2005-01-28 1171.36
1432 2005-02-04 1203.03
1433 2005-02-11 1205.30
1434 2005-02-18 1201.59
1435 2005-02-25 1211.37
1436 2005-03-04 1222.12
1437 2005-03-11 1200.08
1438 2005-03-18 1189.65
1439 2005-03-24 1171.42
1440 2005-04-01 1172.92
1441 2005-04-08 1181.20
1442 2005-04-15 1142.62")
现在,由于它既不是整数也不是浮点数,因此默认情况下,Date列将作为因子读取:
str(sfshort.1)
# 'data.frame': 15 obs. of 2 variables:
# $ Date : Factor w/ 15 levels "2005-01-07","2005-01-14",..: 1 2 3 4 5 6 7 8 9 10 ...
# $ Value: num 1186 1185 1168 1171 1203 ...
因子levels
应该与unique
日期相同。
identical(unique(as.character(sfshort.1$Date)), levels(sfshort.1$Date))
# [1] TRUE
让我们删除第一行,看看会发生什么。
sfshort.2 <- sfshort.1[-1, ]
identical(unique(as.character(sfshort.2$Date)), levels(sfshort.2$Date))
# [1] FALSE
因子水平不变(并且所有将出现在图中)
现在,让我们将“日期”列转换为类POSIXlt
,
sfshort.3 <- transform(sfshort.2, Date=strptime(Date, "%Y-%m-%d"))
str(sfshort.3)
# 'data.frame': 14 obs. of 2 variables:
# $ Date : POSIXlt, format: "2005-01-14" "2005-01-21" "2005-01-28" "2005-02-04" ... ## <- CHANGED!
# $ Value: num 1185 1168 1171 1203 1205 ...
并绘制所有三个版本:
op <- par(mfrow=c(2, 2))
plot(sfshort.1, main="sfshort.1", border=c(2, rep(1, 14)))
plot(sfshort.2, main="sfshort.2")
plot(sfshort.3, main="sfshort.3")
par(op)
我们可以看到sfshort.2
仍然显示"2005-01-07"
,尽管它已被删除。在sfshort.3
中,该问题已消除,并且数据已正确识别为日期。
请注意,在lm
中,您需要执行以下操作,再次将Date
用作因子列:
lm(Value ~ factor(Date), data=sfshort)