Надо указать источники (список литературы, ссылки).

R (язык программирования)

R — язык программирования для статистической обработки данных и работы с графикой, а также свободная программная среда вычислений с открытым исходным кодом в рамках проекта GNU. Язык создавался как аналогичный языку S, разработанному в Bell Labs и является его альтернативной реализацией, хотя между языками есть существенные отличия, но в большинстве своём код на языке S работает для среды R. Изначально R был разработан сотрудниками статистического факультета Оклендского университета Россом Айхэкой (англ. Ross Ihaka) и Робертом Джентлменом (англ. Robert Gentleman) (первая буква их имён — R), на момент 2011 года язык и среда поддерживаются и развиваются организацией R Foundation. R широко используется для статистического программного обеспечения и анализа данных и фактически стал стандартом для статистических программ. R доступен под лицензией GNU GPL. Распространяется в виде исходных кодов, а также откомпилированных приложений под ряд операционных систем: некоторые дистрибутивы Linux, FreeBSD, Microsoft Windows, Solaris, Mac OS X и некоторые другие Unix. В R используется интерфейс командной строки, хотя доступны и несколько графических интерфейсов пользователя. В 2010 году R вошёл в список победителей конкурса «InfoWorld Bossie Awards 2010: The best open source application development software» лучшего открытого программного обеспечения года.

Особенности

R поддерживает широкий спектр статистических и численных методов и обладает хорошей расширяемостью с помощью пакетов. Пакеты представляют собой библиотеки для работы специфических функций или специальных областей применения. В базовую поставку R включен основной набор пакетов. Ещё одной особенностью R являются графические возможности, заключающиеся в возможности создания качественной графики, которая может включать математические символы.

На сегодняшний день, во многих университетах мира R используется для обучения статистике. Его применяют ученые в самых разных областях науки. Надежность этого инструмента подтверждает и то, что специалисты в Google, Facebook и других крупных компаниях успешно применяют его в своей работе.

Приемущества

  • R является Свободным программным обеспечением.
  • R — это очень общий пакет статистического анализа. Изучите CRAN Task View(англ.) чтобы глубоко разобраться в том, что умеет делать R.
  • R широко используется в социальных науках, статистике, экономике, страховом деле, социологии, финансах, физике высоких энергий и так далее.
  • R доступен для всех операционных систем, включая Linux, Mac OS, Windows.
  • R включает самые последние методики.
  • R — объектно ориентированный. Теоретически, всё что угодно может быть сохранено как объект R.
  • R — матричный язык.
  • R включает длинный список функций и пакетов, написанных пользователями. Смотрите: CRAN Contributed packages(англ.).
  • R использует более систематичный синтаксис, нежели Stata или SAS.
  • R может быть установлен на USB-флеш диск.
  • Ядро R — это интерпретируемый язык программирования позволяющий применять циклы, ветвления, а так же создавать свои собственные функции. Язык R был создан Ross Ihaka и Robert Gentleman (Оклендский университет в Новой Зеландии) как некоммерческий вариант языка S, который используется в статистическом пакете S-PLUS
  • Дистрибутив R содержит необходимые функции для выполнения большого числа статистических процедур. Во всяком случае, для биомедицинских исследований хватит с лихвой, и даже если не хватит, всегда можно написать свою функцию либо пакет. Правда, вряд ли эта возможность вам когда-нибудь понадобится.
  • R представляет собой комплексный, интерактивный пакет для управления данными и анализа, который включает в себя функции для стандартной описательной статистики (средние, дисперсии, разброс значений и пр.), а также включает в себя необходимые инструменты для разведывательного анализа данных. Кроме того он имеет много разновидностей обобщенной линейной модели, включая однофакторный и многофакторный дисперсионный анализ. Дополнительные возможности включают пакеты для многомерного анализа и кластерного анализа. Кроме того, пользователям доступны нейронные сети, деревья решений, бутстреп и многое другое.

Полезные инструменты

Для удобства работы с R разработан ряд графических интерфейсов, в том числе:

  • JGR
  • RKWard
  • SciViews-R
  • Statistical Lab
  • Rcmdr
  • Rattle.
  • RStudio

Кроме того, в ряде редакторов предусмотренные специальные режимы для работы с R:

  • ConTEXT
  • Emacs (Emacs Speaks Statistics)
  • jEdit
  • Kate
  • Syn
  • TextMate
  • Tinn-R
  • Vim
  • Bluefish
  • R плагин для Eclipse IDE
  • WinEdt с пакетом RWinEdt
  • Gretl

Функционал R доступен из языка программирования Python при помощи пакета RPy. В проприетарных статистических пакетах SPSS (начиная с версии 16.0) и Statistica (начиная с версии 9.0) появилась поддержка функций R.

Информационный бюллетень R

Два-три раза в год выходит свободно-распространяемый информационный журнал R Journal. Он содержит информацию по статистической обработке данных и разработке, что может быть интересно как пользователям, так и разработчикам R. С января 2001 г. по октябрь 2008 г. он выходил в качестве бюллетеня R News.

Примеры использования

Строим котировки IBM

library(quantmod)  
getSymbols("IBM", from="2010-01-01")  
chartSeries(IBM)  

как добавить на графики MACD, RSI, EMA и другие технические индикаторы:

addMACD()  
addEMA(7)  
addRSI(n=14) 

Сравнение двух выборок в R

По условию, необходимо сравнить две группы, где нет первичных данных. Мы располагаем только средними значениями, величиной стандартного отклонения и численностью групп. Чтобы лучше изучить возможности R, решим эту задачу без использования функций непосредственно реализующих статистические методы.

Располагая данными из условия мы можем вычислить t-критерий (иногда называемый t-статистикой) а затем сравнить с критическим значением. Итак напишем функцию.

###############################################################
# 
# Функция для вычисления t-критерия Стьюдента. Можно сравнивать выборки разного 
# размера. 
# Расчеты по С.Гланц Медико-биологическая статистика, 1999. 
# Функция возвращает значение t-критерия. 
# 
# Аргументы: 
# m - вектор, содержащий средние арифметические групп 
# s - вектор, содержащий стандартные отклонения 
# n - вектор, содержащий численность групп (размеры выборок) 
# 
###############################################################
t <- function(m, s, n){ 
  # Провести проверку длины векторов. Должно быть не более 2. 
  if (length(m)==2 && length(s)==2 && length(n)==2) { 
    # Вычислить число степеней свободы 
    df <- n[1]+n[2]-2; 
    # Вычислить объединенную оценку дисперсии 
    SS <- (((n[1]-1)*s[1]^2)+((n[2]-1)*s[2]^2))/df; 
    # Рассчитать t-статистику 
    T <- (m[1]-m[2])/sqrt(SS/n[1]+SS/n[2]); 
    cat("Значение t-критерия: ", T, "\n"); 
    cat("Число степеней свободы: ", df, "\n"); 
  } 
  else {stop("Сравнивать можно только 2 группы!!!\n")} 
}

Здесь реализован способ расчетов, описанный у С. Гланца. Предварительно проверяется длина векторов. Поскольку метод Стьюдента рассчитан только на две группы, то и значений в векторах должно быть ровно два. Если окажется, что это не так, работа функции t() прекратится и на экран будет выдано сообщение, записанное в функцию stop(), которая предназначена специально для таких ситуаций.

Для вывода результатов на экран использована функция cat(). А для того, чтобы следующие сообщения показывались с новой строки, я добавил «\n».

Осталось подключить скрипт с этой функцией и можно рассчитать t-критерий.

> source("ex4_1.R") 
> t(c(23,45), c(2,7), c(9,16)) 

Значение критерия: -9.14324 Число степеней свободы: 23

> source("ttest.R") 
> m<-c(76.8, 91.4) 
> s<-c(13.8, 19.6) 
> n<-c(9, 16) 
> t(m,s,n) 

Значение t-критерия: -1.968728 Число степеней свободы: 23

> m<-c(2210, 2830) 
> s<-c(1200, 1130) 
> t(m,s,n) 

Значение t-критерия: -1.288502 Число степеней свободы: 23

Теперь немного теории. Одно из удобств использования R — это наличие большого набора статистических таблиц. Для каждого типа распределения доступно четыре функции: плотность вероятности, кумулятивная функция распределения, квантили распределения и генератор случайных значений из данного распределения.

Плотность вероятности непрерывного распределения показывает вероятность получить значение близкое к x. Все функции вычисляющие эту вероятность начинаются с буквы d. Для распределения t-статистики это dt(). График этой функции для нашей задачи можно построить так:

 > curve(dt(x,23),-3,3)

Кумулятивная функция — это вероятность получить величину x или меньшую в данном распределении. Кумулятивные функции для каждого распределения начинаются с буквы p. В нашем случае это pt(). График этой функции можно построить так:

 > curve(pt(x,23),-3,3)

Квантильная функция выполняет действия обратные кумулятивной функции. Она вычисляет величину x при заданной вероятности p. Другими словами, мы задем ей p-й квантиль и получаем ответ, что с заданной вероятностью p может быть получена величина равная или меньше чем x. Построим ее график:

 > curve(qt(x,23),-3,3)

Если сравнить этот график с предыдущим, то станет ясно, что здесь просто поменялись местами оси x и y.

Для решения задачи нам понадобится квантильная функция распределения qt(p, df), где p — квантиль (или вероятность), df — число степеней свободы.

Как вы знаете, чтобы считать различия между группами значимыми при двустороннем варианте критерия Стьюдента, величина критерия t должна быть больше или меньше (при t<0) определенного критического значения. При уровне значимости 0,05, критическое значение t вычисляется так:

 > qt(0.025, 23)

Таким образом, задача решена. При уровне значимости 0,05 полученные значения t больше критического, поэтому различия между двумя группами статистически незначимы. m

Метод классификации k-ближайших соседей в R

#библиотека скачана с CRAN
library(knnflex)
#задаем координаты точек
x1 <- c(rnorm(20,mean=1),rnorm(20,mean=5))
x2 <- c(rnorm(20,mean=5),rnorm(20,mean=1))
x  <- cbind(x1,x2)
#разделяем точки на 2 класса
y <- c(rep(1,20),rep(0,20))
#задаем в тренировочные данные 30 неповторяющихся случайных индексов в диапазоне 1 до 40
train <- sample(1:40,30)
#рисуем точки
plot(x1[train],x2[train],col=y[train]+1,xlab="x1",ylab="x2")
test <- (1:40)[-train]
#Считаем расстояние между каждой парой точек, в нашем случае это просто Евклидово расстояние   
#в 4-х мерном пространстве
kdist <- knn.dist(x)
#считаем результат методом k-ближайших соседей   
#первый параметр – индексы тренировочных данных  
#второй параметр – индексы тестовых данных  
#третий параметр – вектор с результатами для тренировочных данных  
#четвертый параметр – матрица расстояний посчитаная строчкой выше  
#k=3 – используем 3 ближайших соседа
#agg.meth - метод объеденения ответов ближ.с. по умалчанию "большинством" для классиф.
preds <- knn.predict(train,test,y,kdist,k=3,agg.meth="majority")
#Добавить test на участок точек
points(x1[test],x2[test],col=as.integer(preds)+1,pch="+")

Метод кластеризации в R

Рассмотрим область финансовых рынков. Нам необходимо разделить акции различных предприятий на группы. Файл с данными выглядит следующим образом :

DATE,AFLT,GAZP,KMAZ,LKOH,VTBR,URKA,TRNFP,SIBN,SBER,ROSN,RASP,PMTL,PLZL,OGK1,MMBM,GMKN,OGK2,OGK5,AVAZ,MTSI,SNGS,VZRZ
20090428,32.32,143,25.39,1457,0.0307,77.74,12480,85.61,26.1,163.67,51.2,201.7,1382,
0.36,705,2635,0.434,0.909,10.93,161.4,22.851,439
20090429,32.51,149,30.8,1509,0.0317,79.35,13599.78,87.96,27.11,177.21,51.48,204.
49,1389.44,0.409,710,2687.84,0.495,0.972,11.06,166.5,24.038,429

Проанализируем их средствами кластерного анализа. В качестве критерия возьмем логарифмическое изменение цены:
$X_i=log(C_i)-log(C_{i-1})$

Тогда код программы будет таким:

x <-read.table('D:\\stocks.csv', sep=',', header=TRUE) #читаем файл с ценами
x <- x[-1] #отбросим колонку с датой
x <- log(x) #логарифмируем цены
x <- apply(x, 2, diff) #считаем разницу между последовательными элементами
x <- t(x) #транспонируем таблицу
kmeans(x, 5, 1000000) #будем разбивать на 5 класт., максимум 1000000 иттераций


Результатом является таблица:

Чтобы дабиться постраения иерархического дерева кластеризации, необходимо заменить лишь одну строку кода. Преобразованная программа:

x <-read.table('D:\\stocks.csv', sep=',', header=TRUE) #читаем файл с ценами
x <- x[-1] #отбросим колонку с датой
x <- log(x) #логарифмируем цены
x <- apply(x, 2, diff) #считаем разницу между последовательными элементами
x <- t(x) #транспонируем таблицу
hc <- hclust(dist(x))
plot(hc)


Тогда на выходе получается следующее дерево:

Ссылки

Печать/экспорт