Проблема с графиком возникает из-за того, что ваш столбец Дата наиболее вероятен для класса "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
Уровни факторов не изменились (и на графике появятся все ).
Теперь давайте преобразуем столбец Date в класс 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)