Цели этой темы:
1. Сообщить о существовании еще одного мат.пакета (реклама, однако);
2. Написать краткую шпаргалку для себя, в которую можно будет заглянуть через 2 месяца и понять, что и как делать;
3. Получить комментарии уважаемых форумчан к этой шпаргалке, дабы сделать ее более читаемой и, надеюсь, полезной для других.
Понятно, что есть help, но он на английском (это все-таки снижает доступность информации) и он слегка перегружен для первого чтения.
Назвать это курсом нельзя (но хотелось написать что-то вроде
этого), потому что я сам нахожусь в процессе изучения этого пакета и вовсе не являюсь знатоком теории вероятностей или матстатистики. Скорее, это конспект хелпа. Все будет очень поверхностно, я думаю.
Если это окажется никому не интересно, то блога не будет, честное слово
.
Жду критики по всем направлениям, в любой форме. Не гарантирую, что смогу ответить на вопросы.
Шпаргалка по R.
Часть 1. Предварительные замечания.
R представляет собой бесплатно распространяемый математический пакет, ориентированный на задачи теории вероятностей и статистики. Скачать его можно
тут.
При входе в систему мы узнаем, что R - это свободное ПО. Также выходят инструкции о получении помощи:
help() открывает стандартную справку
help.start() открывает справку в окне браузера.
Для получения помощи по конкретной команде нужно ввести
?command_name
или
help(command_name)
R
чувствителен к регистру.
R позволяет использовать русские буквы в идентификаторах (у меня, по крайней мере). IMHO, это совершенно ни к чему.
Комментарии пишутся после знака #:
#все до конца этой строки - комментарий
Оператор присваивания: <- (можно и ->)
x<-5 # x:=5
52+369/85.32 -> y # y:= 52+369/85.32
Возведение в степень: ^
x<-5^(1+2); #x будет равен 125
Названия функций стандартны: log (натуральный, а не десятичный), sin, sqrt, exp, и т.п.
Для работы с комплексными числами нужно явно указывать мнимую часть: sqrt(-11) выдаст NaN (not a number), а вот sqrt(-11+0i) выдаст 0+3.316625i. Коэффициент при i должен стоять даже в том случае, если он равен 1: (2+i)^3 -"Ошибка: объект "i" не найден", а (2+1i)^3 выдаст 2+11i.
Для использования R в качестве калькулятора остается добавить следующее:
Команды отделяются друг от друга символом ; или просто нажатием на Enter;
Команды могут быть сгруппированы в блок с помощью {};
При переводе строки, если вводится отдельная команда, она немедленно выполняется (если это выражение (в частности, имя переменной), то на экран выводится его значение);
При переводе строки, если вводится одна из команд блока, меняется системная подсказка (вместо > возникает +, то же самое происходит и в случае, когда отдельная команда не помещается в одну строку), выполнение произойдет только после ввода закрывающей }.
Часть 2. Векторы.
Векторы - это простейшая из структур данных, используемых в R.
Создадим вектор размерности 5:
x<-c(2.3, 5.6, 8.9, 12, 12.3)
Здесь c - оператор конкатенации. Он принимает на вход векторы и числа, причем их можно перемешивать в любом порядке.
Например, следующая команда вполне корректна и в результате ее выполнения x станет вектором размерности 11:
x<-c(x, 5, x)
Чтобы убедиться в этом, можно ввести просто x. Появится следующее:
[1] 2.3 5.6 8.9 12.0 12.3 5.0 2.3 5.6 8.9 12.0 12.3
Как правило, операции над векторами выполняются покомпонентно. Например, команда
1/x
выведет
[1] 0.43478261 0.17857143 0.11235955 0.08333333 0.08130081
0.20000000 0.43478261 0.17857143
[9] 0.11235955 0.08333333 0.08130081
В квадратных скобках выводится индекс элемента x, с которого начинается вывод в данной строке. Если сделать окно R поуже, то та же команда напечатает
[1] 0.43478261 0.17857143
[3] 0.11235955 0.08333333
[5] 0.08130081 0.20000000
[7] 0.43478261 0.17857143
[9] 0.11235955 0.08333333
[11] 0.08130081
Так как мы не присвоили вычисленное значение никакой переменной, R вычислил его, напечатал и нигде не сохранил (кроме переменной .Last.value).
Обратиться к элементу вектора можно по его индексу, который указывается в квадратных скобках, нумерация начинатеся с 1:
y<-c(x[1],x[3],x[6]) #y будет равен (2.3, 8.9, 5)
Внимание! Если длины векторов не совпадают, то все векторы циклически дополняются до максимальной из длин векторов, участвующих в выражении:
{a<-c(2,3,6); b<-c(1,2,3,4,5,6,7); c<-c(8,3,2,1); d<-a*b+c+9}
Вектор a будет дополнен до (2,3,6,2,3,6,2), вектор c (да, R позволяет использовать с в качестве имени переменной) до (8,3,2,1,8,3,2), а константа 9 будет повторена 7 раз: (9,9,9,9,9,9,9). Вектор d будет равен (19, 18, 29, 18, 32, 48, 25). Так как длины векторов a и b не делят длину вектора b, R выдаст соответствующее предупреждение, но команду выполнит.
Точно так же можно использовать и стандартные функции:
{x<-c(1,2,3,4); y<-sqrt(x)+log(x)}.
Другие функции:
max(), min(), length(), sum() - назначение ясно из названия.
prod() возвращает произведение всех элементов вектора,
sort() выполняет сортировку по возрастанию,
mean() возвращает среднее арифметическое (mean(x)=sum(x)/length(x)),
var() возвращает несмещенную(!) оценку для дисперсии:
var(x)=sum((x-mean(x))^2)/
(length(x)-1).
Для сортировки есть и другие функции (order(), sort.list() ).
Аргументом всех вышеперечисленных функций является единственный вектор (кроме max, min, которые могут принимать несколько векторов), значением - число.
Также имеется функция range(), которая возвращает минимальную и максимальную компоненты вектора: range(x)=c(min(x),max(x)).
Если нужно загнать в вектор арифметическую прогрессию с разностью 1 или -1, то это можно сделать так:
{x<-1:100; y<-100:1; x+y;} #после этого не надо быть Гауссом, чтобы вычислить sum(x)
Двоеточие можно использовать и в индексе, для выкусывания из вектора непрерывных кусков:
{x<-500:100000; y<-x[3:41]; y}
напечатает
[1] 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
520 521 522 523 524
[24] 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540
Если разность прогрессии другая, то можно воспользоваться функцией seq(). У нее 5 аргументов, но одновременно можно использовать лишь некоторые из них.
Первые два параметра - from и to, и команды seq(13, 26), seq(from=13, to=26), seq(to=26, from=13) все равносильны 13:26. Значения from и to по умолчанию равны 1. Заметим, что аргументы можно перечислять в определенном порядке, не именуя их, или именовать, тогда порядок аргументов может быть произвольным.
Если же мы хотим получить все нечетные числа от 3 до 175, то необходимо использовать параметр by (разность прогрессии, по умолчанию, в отсутствие других аргументов, кроме from и to, равна 1):
x<-seq(from=3, to=175, by=2)
На псевдокоде:
Код:
x[1]:=from;
i:=1;
while b<=to do
begin
x[i+1]:=x[i]+by;
i:=i+1;
end;
То есть команды x<-seq(0, 150, by=25) и x<-seq(0, 174.99999, by=25)
равносильны. А вот {x<-seq(0, 174.999999, by=25); x} уже дает другой результат: [1] 0 25 50 75 100 125 150 175.
Точность низковата, как ее изменить, я пока не смотрел
Если to-from и by имеют разные знаки, то R выдает сообщение об ошибке.
Еще один аргумент функции seq() называется length. Значение по умолчанию не задано.Предположим, что мне нужно получить первые 20 чисел, кратных 17:
x<-seq(from=17, by=17, length=20);
Можно использовать только to, by, length:
x<-seq(to=340, by=17, length=20);
или только from, to, length:
x<-seq(from=0, to=5, length=10001); #сетка с шагом 0,0005
#не забываем добавлять 1
но указание from, to, by и length одновременно - ошибка:
x<-seq(from=17, to=340, by=17, length=20);
Имеется также аргумент along.with. Этот аргумент векторный и предназначен для создания прогрессии той же длины, что и указанный вектор. То есть
{y<-c(12,13,56); x<-seq(from=52, along.with=y)}
и
{y<-c(12,13,56); x<-seq(from=52, length=length(y))}
равносильны.
Для некоторых из приведенных выше вариантов использования функции seq() имеются специальные сокращения, см. справку.
И последнее на сегодня. Вот мы насоздавали кучу разных векторов, многократно переопределяя x и пользуясь другими переменными. Все они сохраняются в памяти, причем иногда занимая значительный ее объем. Удалить ненужные более объекты можно с помощью команды rm(), в качестве аргументов ей передаются имена объектов. А получить имена (почти) всех объектов можно с помощью функции objects() или ls() (без аргументов).
Дальнейший план: вероятностные распределения (самое, ИМХО, интересное), линейная алгебра, графика, программирование, чтение данных из файлов и запись в файл.