Обновлено: 21 February 2019 16:02
Необходимо загрузить данные, обработать, нарисовать красивые картинки и сделать подписи. Существует две таблицы с данными по usd и ценами на brent.
Данные тут:
Чтобы скачать данные, используется функцию ‘r read.csv()’:
db <- read.csv(
file = path, # откуда данные
header = T, # есть ли заголовки
sep = ";", # разделитель столбцов
dec = ",", # разделитель десятичной части
stringsAsFactors = F # не конвертировать строчки в факторы
)
Помните о функциях, которые позволить посмотреть, что вы загрузили и решить возникающие проблемы.
dim(db) # размерность
## [1] 6050 3
nrow(db) # количество строк
## [1] 6050
ncol(db) # количество столбцов
## [1] 3
head(db) # первые 10 строк
## nominal date curs
## 1 1 01/07/1992 125,2600
## 2 1 03/07/1992 134,8000
## 3 1 08/07/1992 130,5000
## 4 1 10/07/1992 130,3000
## 5 1 15/07/1992 130,2000
## 6 1 17/07/1992 135,4000
tail(db) # последние 10 строк
## nominal date curs
## 6045 1 09/02/2019 66,0628
## 6046 1 12/02/2019 65,6517
## 6047 1 13/02/2019 65,7147
## 6048 1 14/02/2019 65,6783
## 6049 1 15/02/2019 66,5429
## 6050 1 16/02/2019 66,7044
str(db) # структура данных
## 'data.frame': 6050 obs. of 3 variables:
## $ nominal: int 1 1 1 1 1 1 1 1 1 1 ...
## $ date : chr "01/07/1992" "03/07/1992" "08/07/1992" "10/07/1992" ...
## $ curs : chr "125,2600" "134,8000" "130,5000" "130,3000" ...
Главная функция str()
, которая позволяет увидеть какой тип у ваших данных:
Создайте единую БД, которая будет содержать все даты, начиная с первой, где есть какая-то информация (или цена нефти, или курс), цена нефти на эту дату и значение курса.
Нарисовать график динамики цен и сделать подписи.
Посчитайте, какое количество дней без данных по курсу доллара в каждом месяце, исключив из расчета выходные дни.
Год | Месяц | Кол-во |
---|---|---|
2000 | 1 | 7 |
2000 | 2 | 4 |
2000 | 3 | 5 |
2000 | 4 | 4 |
2000 | 5 | 9 |
2000 | 6 | 5 |
Затем посчитайте, сколько в среднем в каждый месяц дней без данных по курсу c 2000 года. Нарисуйте bar plot. Какие месяца выходят в топ-3?
Напишите функцию, которая будет агрегировать дневные данные в месячные. На вход: данные и тип игрегирования:
Важно. Для каждого ряда последнее значение в месяце не обязательно в один день.
Необходимо написать функцию, которая для двух рядов считает корреляции и коээфициент при регрессии. Расчёт должен производиться для каждого момента времени: если всего \(n\) наблюдений, то для наблюдения \(t\), \(t < n\), считаем корреляцию или коэффициент регрессии для наблюдений c \(t\) по \(n\).
Должна возвращать график динамики изменения коэффицинта регрессии и коэффициента по времени. Функция должна иметь параметр, который отвечает за то, рассматриваются ли абсолютные значения или приросты.
В идеале корреляция показывает сонаправленность двух величин. Выражается от -1
до 1
. Если значение корреляция равно 1, то значит две величины ведут себя одинаково. Корреляция двух одинавых рядов даёт 1.
Для двух рядов \(X\) и \(Y\) расчитывается так:
\[ r_{XY} = \frac{\Sigma_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\Sigma_{i=1}^n(x_i-\bar{x})^2(y_i-\bar{y})^2}} \]
где
\[ \bar{x} = \frac{1}{n}\Sigma_{i=1}^nx_i \] и аналогично для \(\bar{y}\)
Представим зависимости в виде \(y_i = a + b * x_i\). Где \(y\) - курс рубля, \(x\) - цена нефти, \(a\) - константа, \(b\) угловой коэффициент. Само собой наши данные не будут лежать на одной прямой, но мы можем попытаться подобрать такие параметры \((a, b)\), чтобы модель лучшим образом описывала наши данные.
Это всё называется эконометрикой, вам всё объеснят, но пока мы сосредоточимся на результатах. Чтобы получить “хорошие” параметры, существует формула:
\[ coef = (X^TX)^{-1}X^TY \]
где \(coef\) вектор, состоящий из двух значений \(coef = (a,b)\). Эту формулу вам и нужно будет использовать. После получения результата, необходимо взять коэффициент \(b\) (второй коэффициент).
Все произведения матричные. Можете в качестве упражнения проверить, что результат имеет размерность \((2,1)\).
\(Y\) - это вектор со значениями курса рубля, имеет размерность \((n - t + 1,1)\). \(X\) - это матрица, содержащая значения цены брента и константу, имеет размерность \((n - t + 1,2)\).
\(X\) выглядит следующим образом:
\[ \begin{bmatrix} x_{t, 1} & x_{t,2} \\ x_{t+1,1} & x_{t+1,2} \\ \dots & \dots \\ x_{n1} & x_{n2} \end{bmatrix} = \begin{bmatrix} 1 & oil_t \\ 1 & oil_{t+1} \\ \dots & \dots \\ 1 & oil_n \end{bmatrix} \]
Итого:
Для каждого значения \(t: 1 \leq t < n\)
Приросты расчитываются как
\[ d = log(brent_i) - log(brent_{i-1}) \] Это равносильно следующей формуле:
\[ d = \frac{brent_i - brent_{i-1}}{brent_{i-1}} \]
Функция рисует график динамики изменения корреляции или коэффициента регрессии, а также выводит полученную БД.
q <- fcor(db.last, type = 0, what = 0)
kable(head(q))
year | month | correlation |
---|---|---|
1992 | 8 | 0.3856852 |
1992 | 9 | 0.3831392 |
1992 | 10 | 0.3805050 |
1992 | 11 | 0.3778799 |
1992 | 12 | 0.3751009 |
1993 | 1 | 0.3722090 |
Есть стандартная функция для объядинения 2х бд merge
merge(
x, # таблица 1
y, # таблица 2
by = intersect(names(x), names(y)), # указываются имена столбцов, по которым будет производится объединение
by.x = by, by.y = by, # используются, если столбцы называются не одинаково в разных таблицах
all = FALSE, all.x = all, all.y = all) # используются, чтобы оставить все элементы из двух таблиц, все элементы пересечения и элементы х и тд
reshape2
- пакет, который позволяет очень быстро и просто делать агрегирование. В основе 2 главные функции:
melt{
data, # - имя таблицы, переменная
id.vars, # имена столбцов, которые идентифицируют строчку, например c("country","year")
measure.vars, # название перемнных, которые хочется агрегировать, например c("gdp", "investment")
}
dcast(
data, # melt таблица
formula, # формула в виде country ~ variable, где country - будет id столбец таблицы и для каждого значения country будет посчитано значение переменных
fun.aggregate = mean # функция агрегирования, mean, sum, sd, length и тд
)
lubridate
- пакет, где есть такие полезные функции как month
, year
, wday