Введение в R - систему статистического анализа данных

Введение в - систему статистического анализа данных


НА САЙТ MOCKBA - POCTOK  ]

ОГЛАВЛЕНИЕ

	R ...
	ОБЗОР R-средств для решения избранных проблем
	КОМАНДЫ
	СТРАННЫЕ ЧИСЛА
	МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
	СТРУКТУРЫ
	КАК ...
		ДАННЫЕ
		ОБЪЕКТЫ
		СТРОКИ
		ПОСЛЕДОВАТЕЛЬНОСТИ
		УСЛОВИЯ
		ДАТЫ
		ГРАФИКА
		МАТРИЦЫ
		СТАТИСТИКА
		БИБЛИОТЕКИ
	РАЗНОЕ ...
	МИНИМИЗАЦИЯ
	ПАКЕТ SURVIVAL
		Модель Кокса для пропорционального риска
  • Здесь я записываю то, что мне кажется полезно знать и использовать при работе в системе R. Это заметки для памяти. На самом деле всё более обстоятельно и серьёзно. Читайте руководства и хелпы!
  • Система R - бесплатный, активно развивающийся аналог коммерческой системы S+ (GNU S).
  • Реализации R и прикладные пакеты для Windows и Lynux загружайте с сайта проекта R либо с сайта CRAN, CRAN означает "ВСЕОБЪЕМЛЮЩАЯ СЕТЬ АРХИВОВ ДЛЯ R".
  • Версия R выше 2.0 поддерживает интерфейс на русском языке.
  • На английском языке я рекомендую прочитать:
  • Ссылки на материалы по-русски:
    Местами материал разбит на категории, помеченные в тексте как
    	JM	совсем начинающим (Just Married)
    	*	знающим
    	**	опытным
    Проблемы, требующие осторожности, отмечены сочетанием OX
    

    Пишите. А.Михальский


ОБЗОР R-средств для решения избранных проблем в начало

ПРОБЛЕМА в виде ссылки В чём проблемы
Анализ дожития Анализ данных типа дожития, анализ событий (социология), анализ надёжности (техника).
Survival analysis, also called event history analysis in social science, or reliability analysis in engineering.

R ... в начало
Слово из одной буквы R обозначает одновнеменно и язык и вычислительную среду 
	для обработки информации современными статистическими методами.

В операционной системе Windows существуют три способа работы в системе R:
	"с терминала", запускается программой Rterm,
		при этом вы работаете как в DOS вводя команды в ответ на запрос системы,
		вы можете загрузить с диска и файлы, содержащие команды языка R и описания 
		функций-процедур. Выход из этого режима командой quit() или просто q().
	"в командном режиме", запускается программой Rcmd,
		при этом описание всех действий на языке R содержится во входном испоняемом
		файле - аналоге BAT файла в DOS. 
	"используя графический интерфейс", запускается программой Rgui,
		при этом открывается окно со списком различных меню, пиктограммами и окном
		ввода-вывода, в котором можно работать как с терминала.
КОМАНДЫ И КЛАВИШИ в начало
Войдя в систему R первым делом можно посмотреть что у вас есть в рабочей области. Для этого
	введите команду ls(), по которой на экран будет выведен список всех ОБЪЕКТОВ, 
	находящихся в рабочей области: простых переменных, структур, наборов данных, процедур.

Если вы хотите удалить объект под именем xxx, то введите rm(xxx).
	Чтобы удалить ВСЕ объекты из рабочей области введите команду rm(list=ls(all=TRUE)).

JM	Если вы работаете в R через графический интерфейс, то в верхней части экрана вы 	
	видите список различных меню. Чтобы очистить рабочую область, щёлкните один раз
	мышкой по меню "Misc(Разное)", затем по пункту "Remove all objects(Удалить все объекты)", 
	появится табличка "Are you sure?(Вы уверены?)". 
	Если вы не передумали, то нажмите кнопку "Yes(Да)".
В рабочую область можно с загрузить объект, ранее сохранённый на диске.
	load("file_name")	# загружает с диска объект xxx
				# сохранённый ранее командой save(file="file_name",xxx)
Все команды языка R и описания процедур можно предварительно поместить в обычный
	текстовый файд на диска и загрузить в рабочую область командой
	source("file_name")	# загружает с диска файл с именем file_name
				# при этом проверяется синтаксис, создаются объекты,
				# выполняются команды
	Например:
	source("test.r")	# выполняет команды из файла test.r

JM	Если вы работаете в R через графический интерфейс, то в верхней части экрана вы 	
	видите список различных меню. Чтобы загрузить команды из файла на диске щёлкните 
	один раз мышкой по меню "File", затем по пункту "Source R code" и затем по нужному файлу. 
Справку о любой команде вы получите набрав ?cmd или help(cmd) или help('cmd').
	Например: ?ls или help(ls) или help("ls") или help('ls').

	В R есть и гипертекстовая справка. Откройте в меню "Help" пункт "Html help",
	выберите ссылку "Packages", а затем "base". 
Очистить окно вывода можно нажав Ctrl+L.
Сочетание Ctrl+W включает/выключает мгновенный вывод на экран сообщений во время выполнения программы.
По клавише Esc прерывается выполнение программы.
Все введённые команды запоминаются в History, 
	которую можно запомнить в файле (File/Save History) или (altF/altA)
*		loadhistory(file=), 
	загрузить из файла (File/Save History) или (altF/altH)
*		savehistory(file=). 
Вернуться к предыдущей команде можно нажав клавишу "стрелка вверх", к последующей команде 
	можно перейти нажав клавишу "стрелка вниз".
СТРАННЫЕ ЧИСЛА в начало
R оперирует как нормальными числами, так и числами не нормальными. 
В процессе вычислений может получиться бессмысленный результат, который всё же не помешает
дальнейшей работе. Так, допустимо разделить число на ноль. Результатом будет 
"бесконечно большое число", обозначаемое Inf. Оно имеет знак, может участвовать в операциях 
сравнения производя правильный результат. 
	Например:
	a<- 0; b<- 1
	b > 1/a		# это сравнение произведёт результат FALSE
	b < 1/a		# а это сравнение произведёт результат TRUE
Чтобы узнать не получился ли результат бесконечным, используют функции is.finite(x) и is.infinite(x). 
Первая из них принимает значение TRUE если x конечно и FALSE в противном случае. Вторая - наоборот. 
	ЗАДАЧА:  выбрать из вектора X конечные элемента
	РЕШЕНИЕ: 	X[is.finite(X)]
Другим замечательным числом является "не число", обозначаемое NaN (Not a Number). 
Оно может появиться при выполнении бессмысленных вычислений, либо при вводе неправильного числа. 
	Например:
	a<- -1
	b<- log(a)	# логарифм отрицательного числа не определён, результат NaN
Функция is.nan(x) принимает значение TRUE если аргумент NaN и FALSE в противном случае.
Кроме функции is.nan(x) существует функция is.na(x), принимающая значение TRUE если аргумент 
имеет значение NA (Not Available) и FALSE в противном случае. Значение NA генерируется
в тех же случаях, что и значениие NaN, но может относиться и к нечисловым переменным, например, к строкам.
Ну и уж совсем замечательным является NULL, который обозначает буквально НИЧТО. 
Впоследствии это НИЧТО может стать чем угодно. 
	Например:
	a<- NULL
	a<- c(a,3,2)	# a - вектор из двух элементов 3 и 2
МАТЕМАТИЧЕСКИЕ ФУНКЦИИ  ; в начало
	choose(n, k)	# число сочетаний из n по k - коэффициент при x**k в формуле (1+x)**k

	cm(k)		# перевод дюймов в сантиметры
			# Например: cm(1) даёт результат 2.54
СТРУКТУРЫ  ; в начало
	x<-list(a=3,b=c(2,1))	# список, состоящий из 2 элементов: числа 3 и вектора (2,1)
	x$a			# элемент под именем a из списка x
	x$b			# элемент под именем b из списка x
*	x[[1]]			# первый элемент из списка x
*	x[[2]]			# второй элемент из списка x
КАК:  Данные; Объекты; Строки; Последовательности; Условия; Даты; Графика; Матрицы; Статистика; Библиотеки в начало
В этом разделе собраны конкретные приёмы работы в системе R.

ДАННЫЕ в начало

КАК ПРОЧИТАТЬ ИЗ ФАЙЛА ДАННЫЕ, РАЗДЕЛЁННЫЕ ЗАПЯТОЙ 
	dat<- read.table(file="f.txt", sep=",", header=T)	# создаёт объект-таблицу dat
					# в строках которой по записям размещены данные из файла f.txt
					# которые должны быть разделены запятой 
					# причём первая запись воспринимается как заголовок,
					# то есть содержит названия столбцов тоже разделённые запятой
*					# если строка начинается с символа # то она игнорируется как комментарий

КАК ПРОЧИТАТЬ ИЗ ФАЙЛА ДАННЫЕ НИЧЕМ НЕ РАЗДЕЛЁННЫЕ 
	dat<- readLines("f.txt", n=-1)	# создаёт вектор dat из символьных строк, соответствующий записям в файле f.txt
					# число элементов в векторе dat равно числу записей в файле f.txt
					# далее каждую запись можно разобрать по позициям  с помощью функций 
					# substring и as.numeric
	Например: as.numeric(substring(dat[3],11,11))	
		   возвращает число, записанное в 3-ем элементе вектора dat в 11-ой позиции 

*	dat<- readLines("f.txt", n=4)	# создаёт вектор dat из символьных строк, сллтветствующий 4 записям в файле f.txt

КАК ВВЕСТИ ДАННЫЕ С КЛАВИАТУРЫ
	x<- readline("Введите номер. ")	# x равно символьной строке, которую Вы введёте после 
					# надписи на экране "Введите номер."
  
КАК ЗАПИСАТЬ ДАННЫЕ НА ДИСК
	write(dd,file="f.d",ncolumns=4) # сохраняет содержание матрицы dd в файле f.d в 4 колонках
	write(dd,file="f.d") 		# сохраняет содержание матрицы dd в файле f.d в 5 колонках (по умолчанию)

  
КАК ВЫВЕСТИ ДАННЫЕ НА ЭКРАН
	print(X,3) 			# выводит на экран элементы матрицы X. Если дробные, то не более 3 цифр.
	Например:
		print(12.34,1) 		# Результат: 12
		print(12.34,2) 		# Результат: 12
		print(12.34,3) 		# Результат: 12.3
		print(12.34,4) 		# Результат: 12.34
		print(12.34,5) 		# Результат: 12.34

  
КАК РЕДАКТИРОВАТЬ ДАННЫЕ СРЕДСТВАМИ R
	fix(dat) 			# Выводит в отдельном окне содержание набора dat с возможностью его изменения.
OX					# Все изменение сразу же вносятся в набор dat.

ОБЪЕКТЫ в начало

КАК УЗНАТЬ ИЗ ЧЕГО СОСТОИТ ОБЪЕКТ
	str(obj)			# показывает структуру объекта obj

КАК ПОСМОТРЕТЬ НА ЭКРАНЕ СОДЕРЖАНИЕ ОБЪЕКТА	
	obj				# выводит на экран содержание объекта obj
*	fun				# вывод на экран текста программы fun
*	fun()				# выполнение программы fun без аргументов
OX	Error: Object "..." not found	# сообщение если объект ещё не задан

КАК УДАЛИТЬ ОБЪЕКТ
	rm(obj)				# удаляет объект obj из рабочей области

КАК ПРОСМОТРЕТЬ СОСТАВ РАБОЧЕЙ ОБЛАСТИ  
	ls()				# выводит на экран список объектов в рабочей области

КАК УДАЛИТЬ ВСЕ ОБЪЕКТЫ ИЗ РАБОЧЕЙ ОБЛАСТИ  
OX	rm(list=ls())			# очищает рабочую область (а Вам это надо?)

СТРОКИ в начало


КАК ВЫДЕДЕЛИТЬ ЧАСТЬ ИЗ СИМВОЛЬНОЙ ПЕРЕМЕННОЙ
	substring("abvgd",3,4)			# равно строке "vg"

КАК РАЗБИТЬ СТРОКУ-СИМВОЛЬНУЮ ПЕРЕМЕННУЮ НА ЭЛЕМЕНТЫ
	strsplit("abcdefg","e")			# равно вектору с элементами "abcd", "fg"
	strsplit("ab cd ef g"," ")		# равно вектору с элементами "ab", "cd", "ef", "g"

КАК В СТРОКЕ-СИМВОЛЬНОЙ ПЕРЕМЕННОЙ ИЗМЕНИТЬ ЧАСТЬ
	sub('a','A','baba')			# заменяет первый символ a на A, в результате получим bAba
	gsub('a','A','baba')			# заменяет все символы a на A, врезультате получим bAbА
						# Если третий аргемент - вектор, то замена производится 
						# во всех его элементах

КАК ПРЕОБРАЗОВАТЬ СТРОКУ В ЧИСЛО
	x<- as.numeric('3.14')			# переменная x принимает значение 3.14
	x<- as.numeric('a')			# переменная x принимает значение NA (см. СТРАННЫЕ ЧИСЛА)

КАК ПРЕОБРАЗОВАТЬ ЧИСЛО В СТРОКУ
	x<- as.character(3.14)			# переменная x принимает символьное значение '3.14'

КАК ОБЪЕДИНИТЬ СТРОКИ
	x<- paste('a','b')			# переменная x принимает символьное значение 'a b'
	x<- paste(с('a','b'))			# переменная x становится вектором из двух символьных элементов 'a' и 'b'
	x<- paste(с('a','b'),collapse ='; ')	# переменная x принимает символьное значение 'a; b'

ПОСЛЕДОВАТЕЛЬНОСТИ в начало

КАК СГЕНЕРИРОВАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ЧИСЕЛ
	x<- 0:7				# в x содержится последовательность чисел от 0 до 7
*	Все операции над x выполняются над всеми числами, составляющими этот объект.
	То есть x+1 порождает последовательность чисел от 1 до 8. 
	Аналогично 0:7+1 порождает последовательность чисел от 1 до 8,
	но 0:(7+1) порождает последовательность чисел от 0 до 8.

	seq(1,10,by=2)			# генерирует последовательность нечётных чисел 1, 3, 5, 7, 9
	seq(2,10,2)			# генерирует последовательность чётных чисел 2, 4, 6, 8, 10
	seq(3, 10, length.out= 5)	# генерирует 5 равноотстоящих чисел на отрезке [3,10]


КАК СГЕНЕРИРОВАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ СЛУЧАЙНЫХ  ЧИСЕЛ
	sample(c(0,1),100,replace =TRUE,prob=c(0.2,0.8)) # генерирует последовательность из 100 чисел 0 и 1. 
							 # Вероятность выпасть 0 - 0.2, 1 - 0.8
*	set.seed(125141)		# задаёт начальное состояние генератора случайных чисел

КАК ВЫБРАТЬ ИЗ ПОСЛЕДОВАТЕЛЬНОСТИ ЭЛЕМЕНТЫ БЕЗ ПОВТОРЕНИЙ
	x<- unique(c(1,1,2))		# x состоит из чисел 1 и 2
	
КАК ВЫЧИСЛИТЬ СУММУ ВСЕХ ЭЛЕМЕНТОВ ПОСЛЕДОВАТЕЛЬНОСТИ
	x<- sum(c(1,1,2))		#  x равен 4
	
КАК ВЫЧИСЛИТЬ КУМУЛЯТИВНУЮ СУММУ ВСЕХ ЭЛЕМЕНТОВ ПОСЛЕДОВАТЕЛЬНОСТИ
	x<- cumsum(c(1,1,2))		#  x - вектор, состоящий из элементов 1, 2, 4
	
КАК УПОРЯДОЧИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ
	x<- c(3,1,2,4)
	y<- x[order(x)]				#  y - вектор, состоящий из элементов 1, 2, 3, 4	
	z<- x[order(x,decreasing = TRUE)]	#  z - вектор, состоящий из элементов 4, 3, 2, 1	

УСЛОВИЯ в начало

КАК ПРОВЕРИТЬ РАВЕНСТВО
	чисел
		A==B			# производит одно значение TRUE если число A равно числу B, иначе FALSE

	векторов
		V1==V2			# производит вектор значений с элементами TRUE, соответвтвующими равным элементам
					# векторов V1 и V2, и остальными элементами FALSE
*					# ЕСЛИ V2 ЧИСЛО, ТО ВЕКТОР V1 ПОЭЛЕМЕНТНО СРАВНИВАЕТСЯ С ЭТИМ ЧИСЛОМ
*					# ЕСЛИ V2 СОДЕРЖИТ ЭЛЕМЕНТОВ МЕНЬШЕ, ЧЕМ ВЕКТОР V1, ТО НЕДОСТАЮЩИЕ ЭЛЕМЕНТЫ 
*					# ЦИКЛИЧЕСКИ ДОБАВЛЯЮТСЯ

		all(V1==V2)		# производит одно значение TRUE если все элементы вектора V1 равны
					# соответствующим элементам вектора V2, иначе FALSE
КАК ОПРЕДЕЛИТЬ В ВЕКТОРЕ ПОЛОЖЕНИЕ ЭЛЕМЕНТОВ ЗАДАННОЙ ВЕЛИЧИНЫ
	which(x==2)			# создаёт вектор с номерами элементов вектора x, равных 2

	Например:
	x<- c(1,2,3,4,2)
	y<- which(x==2)			# y - вектор из 2 элементов (2,5)
КАК ОПРЕДЕЛИТЬ В ВЕКТОРЕ ПОЛОЖЕНИЕ МИНИМАЛЬНОГО ЭЛЕМЕНТА
	which.min(x)			# (первый) номер минимального элемента вектора x

КАК ОПРЕДЕЛИТЬ В ВЕКТОРЕ ПОЛОЖЕНИЕ МАКСИМАЛЬНОГО ЭЛЕМЕНТА
	which.max(x)			# (первый) номер максимального элемента вектора x

КАК В МАТРИЦЕ ОПРЕДЕЛИТЬ ПОЛОЖЕНИЕ МАКСИМАЛЬНОГО ЭЛЕМЕНТА ПО СТРОКАМ
	max.col(X)			# вектор длины nrow(X), содержащий номера столбцов с максимальными элементами 
					# по строке матрицы X
КАК ОПРЕДЕЛИТЬ В ВЕКТОРЕ ПОЛОЖЕНИЕ ЭЛЕМЕНТОВ ДРУГОГО ВЕКТОРА
	match(x,y)			# создаёт вектор той же длины, что и вектор x, с номерами элементов вектора y,
					# совпадающих с элементами вектора x либо значениями NA
	x%in%y				# создаёт ЛОГИЧЕСКИЙ вектор той же длины, что и вектор x, с элементами TRUE 
					# на мести элементов, присутствующих в векторе y, и FALSE иначе

	Например:
	z<- match(c(1,2,3,4,2),c(2,4))	# z - вектор из 5 элементов (NA,1,NA,2,1)
	z<- match(c(2,4),c(1,2,3,4,2))	# z - вектор из 2 элементов (2,4)
	z<- c(1,2,3,4,2)%in%c(2,4)	# z - вектор из 5 элементов (FALSE,TRUE,FALSE,TRUE,TRUE)
	z<- c(2,4)%in%c(1,2,3,4,2)	# z - вектор из 2 элементов (TRUE,TRUE)

ДАТЫ в начало

		
КАК ПРЕОБРАЗОВАТЬ СТРОКУ, ИЗОБРАЖАЮЩУЮ ДАТУ, В ОБЪЕКТ DATE
	z0 <- strptime("12.10.11", "%m.%d.%y")	# z0 соответствует 10 декабря 2011 года
OX					# используется столетие, заданное системой R без смысловой проверки
OX					# strptime("12.10.41", "%m.%d.%y") соответствует 10 декабря 2041 года
	z1 <- strptime("20.07.1909", "%d.%m.%Y")# z1 соответствует 20 июля 1909 года

КАК ВЫЧИСЛИТЬ СКОЛЬКО ПРОШЛО ВРЕМЕНИ МЕЖДУ ДВУМЯ ДАТАМИ
	z0 <- strptime("21.10.2011", "%d.%m.%Y")
	z1 <- strptime("12.12.11", "%d.%m.%y")
	zz=difftime(z1,z0,units='weeks')	# zz равно числу недель, прошедших с 21.10.2011 до 12.12.2011
						# параметр units может принимать значения "auto", "secs", "mins", 
						# "hours", "days", "weeks"
OX						# zz - НЕ ЧИСЛО!
	zz=as.numeric(zz)			# преобразует zz в число

КАК ОПЕРИРОВАТЬ С ОБЪЕКТАМИ DATE
	as.numeric(z1-z0)			# число дней, прошедших между z0 и z1
	z1>z0					# правда ли, что z0 раньше z1?
	z1>=z0					# правда ли, что z0 не позже z1?
	z1!=z0					# правда ли, что z0 и z1 разные даты?
	z1==z0					# правда ли, что z0 и z1 совпадают?

ГРАФИКА в начало

		
КАК НАРИСОВАТЬ ГИСТОГРАММУ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ВЕКТОРА X
	hist(x)				# нарисовали гистограмму
	hist(x,breaks=11) 		# нарисовали гистограмму для 10 ячеек
*	1. aux<- hist(X,plot=FALSE)	# создали объект класса histogram не рисуя его
*	2. plot.histogram(aux)		# применили метод plot к объекту класса histogram
*					# нарисовали гистограмму
*	3. aux2<- hist(Y,plot=FALSE)	# создали объект класса histogram не рисуя его
*	4. lines.histogram(aux2)	# применили метод lines к объекту класса histogram
*					# добавили гистограмму

КАК СОЗДАТЬ ДВА РИСУНКА В ОДНОМ ОКНЕ
	1. par(mfrow = c(1, 2))		# задаём две графические подобласти
	2. plot(x,y,type="l")		# рисуем первый график в виде линии
	3. plot(x,z,type="p")		# рисуем второй график в виде точек

КАК ОТКРЫТЬ НОВУЮ СТРАНИЦУ ДЛЯ РИСОВАНИЯ
            x11()                       # открывает стандартную графическую страницу (устройство)

КАК СДЕЛАТЬ СТРАНИЦУ (УСТРОЙСТВО) ДОСТУПНЫМ ДЛЯ РИСОВАНИЯ
            dev.set()                    # делает активной очередную графическую страницу (устройство) 
*           dev.set(3)                   # делает активной графическую страницу (устройство) номер 3 

КАК НАРИСОВАТЬ ГРАФИК С ПОДПИСЯМИ НА ОСЯХ И КРАСНОЙ КРИВОЙ
	plot(x,y,xlab="time",ylab="distance",title="Distance as function of time",col="red",type="l")

КАК ИЗМЕНИТЬ РАССТОЯНИЕ ДО НАДПИСЕЙ
	plot(x,y,mgp=c(ax,ay,az))       # ax - расстояние до оси x,
                                        # ay - расстояние до оси y,
                                        # az - расстояние до заголовка
                                        # по умолчанию приняты значения (3, 1, 0)
                                        
КАК ИЗМЕНИТЬ ОБРАМЛЕНИЕ ГРАФИКА
	plot(x,y,bty='o')               # замкнутая рамка
	plot(x,y,bty='l')               # левый нижний угол
	plot(x,y,bty='n')               # обрамление отсутствует

КАК НАРИСОВАТЬ ГРАФИК БЕЗ РАМКИ И БЕЗ ОСЕЙ
	plot(x,y,,bty='n',xaxt='n',yaxt='n')

КАК ЗАДАТЬ РАЗМЕР ГРАФИКА
	par(fin=c(x,y))			# определяет область рисования в x дюймов по ширине и y дюймов по высоте

КАК ИЗМЕНИТЬ РАССТОЯНИЕ МЕЖДУ НАДПИСЬЮ И ГОРИЗОНТАЛЬНОЙ ОСЬЮ
	axis(1, ...,mgp=c(3, y, 0))	# величина y>0 опредеяет расстояние между надписью и осью. Пробуйте.
!	            			# но сначала надо выполнить команду plot!

	Например:	
axis(1,at=seq(750,7000,500),pos=c(0,0))  # расставляет метки 750, 1250, ..., 7000 вдоль горизонтальной оси,
                                         # начинающейся в левом нижнем углу графика, построенного командой plot

КАК ПОСТАВИТЬ ГОРИЗОНТАЛЬНЫЕ МЕТКИ У ВЕРТИКАЛЬНОЙ ОСИ
	axis(2, ...,,las=1)		# параметр положения подписи las может иметь значения
					# 	0 - параллельно оси (по умолчанию)
					#	1 - всегда горизонтально
					#	2 - перпендикулярно оси
					#	3 - всегда вертикально
!         				# но сначала надо выполнить команду plot!

КАК ИЗМЕНИТЬ ШРИФТ НАДПИСЕЙ НА ГРАФИКЕ (MS Windows)
	par(font=n, font.lab=m, font.main=k, font.sub=n)	# определяет шрифты номер n, m, k, n для надписей
** 	# Соответствие между номером шрифта и шрифтом устанавливаеися по порядку перечисления в текстовом файле
**	# C:\Program Files\R\rw1071\etc\Rdevga
**	# в виде TT имя : стиль. 
**	Например: TT Arial Cyr : plain 
**	# Можно определить до 32 шрифтов.
OX	# ШРИФТ НОМЕР 5 ЗАНЯТ ДЛЯ МАТЕМАТИЧЕСКИХ СИМВОЛОВ И ГРЕЧЕСКИХ БУКВ

КАК ДОБАВИТЬ НА ГРАФИК КРИВУЮ СИНЕГО ЦВЕТА 
	lines(x,y,col="blue") 	# но сначала надо выполнить команду plot!

КАК ДОБАВИТЬ НА ГРАФИК ТЕКСТ 
	text(x,y,labels="X") 	# в точке с координатами x и y выведен символ X
					# но сначала надо выполнить команду plot!

КАК ИДЕНТИФИЦИРОВАТЬ ТОЧКУ НА ГРАФИКЕ 
	identify(x,y) 		# рядом с точкой, по которой кликните левой кнопкой мышки,
					# выводится номер этой точки в массивах x и y 
*	identify(x,y,labels =c('a','b',...) ) 		# рядом с точкой выводится метка, а не номер точки

КАК НАРИСОВАТЬ ПУНКТИРНУЮ КРИВУЮ
	lines(x,y,lty=2) 		# значение параметра lty может быть
					# 0 - не рисовать
					# 1 - сплошная линия
					# 2 - пунктир
					# 3 - штрих
					# 4 - штрих пунктир
					# 5 - длинный пунктир
					# 6 - длинный щтрих пунктир
*				# Вы можете самостоятельно задать длину пунктира	
*     lines(x,y,lty='x')		# здесь x - строка, содержащая до 8 шестнадцеричных цифр
*     lines(x,y,lty='33',lwd=2)	# нечётные цифры - длина штриха в величинах параметра lwd
*     				# чётные цифры - длина интервала между штрихами в величинах параметра lwd
*     				# lwd=1 соответствует одному пикселю
*		Например:
*    lines(x,y,lty='3111',lwd=2)	# штрих пунктирная линия


КАК ДОБАВИТЬ НА ГРАФИК ГОРИЗОНТАЛЬНУЮ ЛИНИЮ СИНЕГО ЦВЕТА 
	     abline(h=a,col="blue") 	        # a - уровень по y, на котором проводится линия

КАК ДОБАВИТЬ НА ГРАФИК ВЕРТКАЛЬНУЮ ЛИНИЮ СИНЕГО ЦВЕТА 
	     abline(v=a,col="blue") 	        # a - положение по x, на котором проводится линия

КАК ПОСТРОИТЬ 3D ПОВЕРХНОСТЬ, КОТОРУЮ МОЖНО ВРАЩАТЬ, ПРИБЛИЖАТЬ И УДАЛЯТЬ МЫШКОЙ (пакет rgl)
             open3d()				# открываем графическое окно
             persp3d(z)				# z - матрица, значения элементов которой задают высоту поверхности
             persp3d(z, color='green')		# поверхность будет зелёного цвета (по умолчанию цвет чёрный)	
             persp3d(z, color=cl)		# cl - вектор цвета для элементов матрицы z (расположенных по столбцам)
*            cl <- rainbow(7)[6*(max(z)-z)/(max(z)-min(z))+1] # располагает 7 цветов радуги так, чтобы поверхность 
							      # раскрасилась согласно значению её высоты

КАК ЗАПОМНИТЬ ГРАФИК В ФАЙЛ В PDF ФОРМАТЕ
	pdf(file="xx.pdf")			# открывает файл xx.pdf для вывода графика в pdf формате
	pdf(file="xx.pdf",paper = "a4r")	# открывает файл xx.pdf для вывода графика в pdf формате 
						# с альбомной ориентацией
	...					# создаёте график
	dev.off()				# закрывает то, что открыто

КАК ЗАКРЫТЬ ВСЕ ОТКРЫТЫЕ ГРАФИЧЕСКИЕ ОКНА
	graphics.off()				# закрывает все открытые графические устройства

МАТРИЦЫ в начало

КАК СОЗДАТЬ ЕДИНИЧНУЮ МАТРИЦУ 
	aux<- diag(1,5)	# создаём матрицу 5х5 с 1 на диагонали и 0 в остальных местах

КАК СОЗДАТЬ МАТРИЦУ ИЗ n СТРОК И m СТОЛБЦОВ, ЗАПОЛНЕННУЮ НУЛЯМИ
	aux<- matrix(0,nrow=n,ncol=m)	#
*	1. aux<- rep(0,n*m)		# создаём вектор из n*m нулей
*	2. dim(aux)<- c(n,m)		# задаём размерности 

КАК ОБРАТИТЬСЯ К СТРОКАМ ИЛИ СТОЛБЦАМ МАТРИЦЫ M
	M[i,j]				# эдемент в i-той строке, j-том столбце
	M[i,]				# i-тая строка
	M[,j]				# j-тый столбец 
	M[c(1,3,5),]			# строки 1, 3 и 5 
	M[,c(1,3,5)]			# столбцы 1, 3 и 5 
	M[i:j,]				# строки с i по j 
	M[,i:j]				# столбцы с i по j 
	
КАК УДАЛИТЬ УКАЗАННЫЕ СТРОКИ МАТРИЦЫ
	M[-c(1,3,5),]			# удаляем строки 1, 3 и 5 
	M[-3:5,]			# удаляем строки с 3 по 5 
	M[-i:j,]			# удаляем строки с i по j 
*	M[-(i+1):(j+1),]		# удаляем строки с i+1 по j+1 
*	M[-i:j+1,]			# удаляем строки с i+1 по j+1 

КАК УДАЛИТЬ УКАЗАННЫЕ СТОЛБЦЫ МАТРИЦЫ
	M[,-c(1,3,5)]			# удаляем столбцы 1, 3 и 5 
	M[,-3:5]			# удаляем столбцы с 3 по 5 
	M[,-i:j]			# удаляем столбцы с i по j 
*	M[,-(i+1):(j+1)]		# удаляем столбцы с i+1 по j+1 
*	M[,-i:j+1]			# удаляем столбцы с i+1 по j+1 

КАК ПЕРЕМНОЖИТЬ МАТРИЦЫ			
	C<- A%*%B			# матрица A(n,k) перемножается на матрицу B(k,m), результат C(n,m)

КАК УМНОЖИТЬ МАТРИЦУ НА СЕБЯ ТРАНСПОНИРОВАННУЮ
	C<- t(A)%*%A
*	C=crossprod(A)			# то же, что и t(A)%*%A, но быстрее

КАК ВЫЧИСЛИТЬ СУММУ КВАДРАТОВ ЭЛЕМЕНТОВ ВЕКТОРА			
	c<- crossprod(V)		# c=v1**2+v2**2+...

КАК СЛОЖИТЬ СТОЛБЦЫ МАТРИЦЫ			
	C<- rowSums(A)			# вектор C равен поэлементной сумме столбцов матрицы A

КАК СЛОЖИТЬ СТРОКИ МАТРИЦЫ			
	C<- colSums(A)			# вектор C равен поэлементной сумме строк матрицы A

КАК СОЗДАТЬ МНОГОМЕРНЫЙ МАССИВ (многомерную матрицу)
	C=array(rep(0,60),dim=c(3,4,5))	# создаём набор из 5 матриц, состоящих из 3 строк, 
						# 4 столбцов, заполненных нулями 

КАК СОЗДАТЬ БЛОЧНУЮ МАТРИЦУ
	C=kronecker(diag(3), M)		# матрица C состоит из 3 матриц M (не обязательно квадратных)
					# расположенных на "диагонали" матрицы C

КАК СОЗДАТЬ МАТРИЦУ K-тых РАЗНОСТЕЙ
	C=diff(diag(5),differences=1)	# результирующая матрица 
						-1  1  0  0  0
						 0 -1  1  0  0
						 0  0 -1  1  0
						 0  0  0 -1  1
	C=diff(diag(5),differences=2)	# результирующая матрица 
						 1 -2  1  0  0
						 0  1 -2  1  0
						 0  0  1 -2  1

СТАТИСТИКА в начало

КАК СФОРМИРОВАТЬ СЛУЧАЙНУЮ ПОДВЫБОРКУ ИЗ ЭЛЕМЕНТОВ ВЕКТОРА x
	y<- sample(x,10)		# выбирает случайным образом 10 элементов вектора x и помещает их в вектор y
	y<- sample(x)			# случайная перестановка элементов вектора x
*	sample(c(0,1),100,replace=TRUE)	# случайная последовательность из 100 равновероятных значений 0 и 1
	
КАК ПОСЧИТАТЬ ЧАСТОТУ ПОЯВЛЕНИЯ РАЗЛИЧНЫХ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ВЕКТОРА x
	x<- c(1,0,0,1,1,1,0)		# вектор из 0 и 1
	aux<- table(x)			#  aux содержит число различных значенией элементов вектора x
	aux/length(x)			# нормировка на общее число элементов вектора x

КАК НАРИСОВАТЬ ГИСТОГРАММУ ЧАСТОТ ПОЯВЛЕНИЙ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ВЕКТОРА x
	hist(x)				# (см. также hist в разделе ГРАФИКА)

КАК ПОСЧИТАТЬ ЧАСТОТУ ПОЯВЛЕНИЯ РАЗЛИЧНЫХ КОМБИНАЦИЙ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ВЕКТОРОВ x И y
	aux<- table(x,y)		#  aux содержит число различных комбинаций значенией элементов векторов x и y
	aux/length(x)			# нормировка на общее число элементов 

КАК ВЫЧИСЛИТЬ СРЕДНЕЕ, ДИСПЕРСИЮ, КОРРЕЛЯЦИЮ
	mean(x)				# выборочное среднее значение элементов вектора x 
	var(x)				# выборочная дисперсия для элементов вектора x
	cor(x,y)			# коэффициент корреляции между элементами векторов x и y
	cor(z)				# матрица корреляции между столбцами матрицы z
*	cor(z[,1:2])			# коэффициент корреляции между элементами столбцов 1 и 2 матрицы z

КАК ВЫЧИСЛИТЬ ДОВЕРИТЕЛЬНЫЙ ИНТЕРВАЛ ДЛЯ ВЕРОЯТНОСТИ УСПЕХА ПРИ НАБЛЮДЕНИИ k УСПЕХОВ В n ИСПЫТАНИЯХ
	aux=binconf(3,10,alpha=.05)	# Вычисление вероятности успеха и её 95% доверительного интервала 
					# если из 10 независимых попыток 3 были успешны.
					# aux[1] - оценка вероятности успеха,
					# aux[2:3] - нижняя и верхняя границы 95% доверительного интервала.
* 					# ВХОДИТ В СОСТАВ ПАКЕТА Hmisc

КАК ПРОВЕРИТЬ ЗНАЧИМОСТЬ КОЭФФИЦИЕНТА КОРРЕЛЯЦИИ
	z<- cor.test(x,y)		# z$estimate - коэффициент корреляции между элементами векторов x и y
					# z$conf.int - 95% доверительный интервал для оценки коэффициента корреляции
					# z$p.value - p-value, достигнутое при проверке гтпотезы о нулевом значении коэффициента корреляции

КАК ГРАФИЧЕСКИ ИЗОБРАЗИТЬ МАТРИЦУ КОРРЕЛЯЦИИ
	symnum(cor(X))		# пробуйте, смотрите!

КАК ОТРАЗИТЬ РАСПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ y ПО ГРУППАМ ПЕРЕМЕННОЙ x
	xy<- data.frame(cbind(x,y))	# создаём структуру данных в виде матрицы из двух столбцов, 
OX					# элемент вектора x - признак группы, к которой принадлежит соответствующий 
					# элемент вектора y
JM					#   число элементов в векторах x и y должно быть одинаковым
	names(xy)<= c('X','Y')		# даём имена столбцам
	boxplot(Y~X,data=xy)		# рисуем Тьюки бокс-плот, состоящий прямоугольников (по числу групп) 
					# постоянной ширины, при этом
					#   по вертикали каждый прямоугольник покрывает 
					#	доверительный интервал (95%?) для переменной y в группе, 
					#   горизонтальная черта внутри примоугольника проводится на уровне 
					#	медианы для переменной y в группе, 
					#   горизонтальные чёрточки вне прямоугольника показывают 
					#	крайние допустимые значения для переменной y в группе 

	boxplot(Y~X,data=xy,range=0)	# рисуем Тьюки бокс-плот, в котором горизонтальные чёрточки вне прямоугольника 
					# показывают максимальное и минимальное значения для переменной y в группе

	boxplot(Y~X,data=xy,varwidth=T)	# рисуем Тьюки бокс-плот, состоящий прямоугольников с шириной, 
					# пропорциональной корню квадратному из числа элементов в группе

						Пример построения Тьюки бокс-плот.

КАК НАРИСОВАТЬ ПОПАРНЫЕ ЗАВИСИМОСТИ МЕЖДУ СТОЛБЦАМИ
	pairs(aux)			# значения элементов для пар столбцов матрицы aux изображаются кружками 
					# на отдельных графиках для каждой пары
	pairs(aux,col='red')		# красного цвета
	pairs(aux,pch=19)			# точками
	pairs(aux,pch=19,cex=1.5)		# увеличенными точками
	pairs(aux,upper.panel=NULL)		# изображаются только пары для столбцов i>j


КАК ПОСТРОИТЬ ЛИНЕЙНУЮ РЕГРЕССИОННУЮ МОДЕЛЬ
	a1=lm(y~x,data=XXX)		# строит регрессионную модель вида y=a+b*x
					# по набору данных (data.frame), содержащему переменные x и y
	a2=lm(y~x1+x2,data=XXX)		# строит регрессионную модель вида y=a+b*x1+c*x2
					# по набору данных (data.frame), содержащему переменные x1, x2 и y

КАК ДОБАВИТЬ НА ГРАФИК РЕГРЕССИОННУЮ ЛИНИЮ
	abline(a1)			# объект a1 создан командой lm

БИБЛИОТЕКИ в начало

КАК УЗНАТЬ КАКИЕ БИБЛИОТЕКИ УСТАНОВЛЕНЫ В СИСТЕМЕ R
	installed.packages()		# список установленных библиотек

КАК ПОДКЛЮЧИТЬ БИБЛИОТЕКУ 
	library(xxx)			# подключает библиотеку xxx для работы	
РАЗНОЕ ... в начало
Как и в любом языке программирования, в R основным оператором является КОММЕНТАРИЙ. 
	Всё после символа # до конца строки не воспринимается интерпретатором.

В R различаются строчные и заглавные буквы. Это значит, что X и x обозначают
	РАЗНЫЕ объекты.

В R оператор присваивания значения записывается парой символов  <-   либо  -> , но в последних версиях
	можно использовать и один символ =. 
	А ещё правомерно писать i<-j<-1 или 1->i->j либо i=j=1,
	а вот 1=i=j будет ошибкой!

В R символ ; разделяет операторы.

В R пара символов {  } является ОПЕРАТОРНЫМИ СКОБКАМИ, то есть всё между ними
	рассматривается как один оператор.
		if(A>B) A<-B; B<-0	# B всегда получает значение 0.
		if(A>B) {A<-B; B<-0}	# B получит значение 0 только когда A будет больше B.

В R все объекты локальны, то есть область их действия ограничена телом функции, в которой
	объект задан. Чтобы определить глобальный объект – объект доступный из всех функций,
	используют специальный символ присвоения <<-
		a<<- b			# b - локальный объект, a - глобальный объект

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

		ПРИМЕР НЕПРАВИЛЬНОЙ СТРУКТУРЫ ПРОГРАММЫ
	...			#
	MYFUN(...)		# обращение к функции MYFUN
	...			#
	MYFUN<- function(...){	# описание функции MYFUN
	...			#
			     }	#

Бывает, что обычной двоичной логики не хватает для выражения всей глубины мысли. Тогда вместо условных операторов,
	использующих простые условия, приводящие к результату TRUE или FALSE, можно использовать оператор
	switch(n,a1,...,ak) результатом которого является значение aj, указанное на j-том месте после первого
	параметра n. При этом j - значение этого параметра.

	n<-3			#
	switch(n,11,12,13,17)	# результат равен 13

*	Если значение первого параметра меньше единицы или превосходит число перечисленных за ним параметров,
	то результатом является значение NULL - ничто. А, вот, если значение первого параметра дробное, то дробная 
	часть отбрасывается со всеми последствиями.
**	В качестве любого из параметров a1,...,ak могут стоять любые констркуции языка R.
	Например: switch(n,11,list(a=12),c(13,17))
МИНИМИЗАЦИЯ в начало
МИНИМИЗАЦИЯ ФУНКЦИИ f МЕТОДОМ НЬЮТОНА
	A<- nlm(f,p)		# f - минимизируемая функция, задаётся процедурой R
				# p - вектор начальных значения параметров
				# A - список, содержащий результаты минимизации в виде
				#	A$minimum - достигнутая величина функции F
				#	A$estimate - найденные значения параметров
				#	A$gradient - достигнутое значение градиента
				#	A$code - код окончания процесса минимизации: 
				#		1 - относительная величина градиента близка к нулю
				#		2 - достигнута сходимость в пределах точности
				#		3 - не удалось уменьшить значение функции
				#		4 - достигнуто максимальное число итераций (см. параметр iterlim)
				#		5 - пять раз подряд превышено максимальное значение шага (см. параметр stepmax)
				#	A$iterations - число выполненных итераций
				# ТАМ ЕЩЁ МНОГО РАЗНЫХ ПАРАМЕТРОВ!
Пример
	f <- function(x, a) sum((x-a)^2)	# задание квадратичной функции
	A<- nlm(f, c(10,10), a=c(3,5))		# минимизация по двум праметрам начиная с точки (10,10)
						# РЕЗУЛЬТАТ:
						# 	A$minimum = 3.374780e-25
						# 	A$estimate = c(3,5)
						# 	A$gradient = c(6.759038e-13,-9.450218e-13)
						# 	A$code = 1
						# 	A$iterations = 2
ПАКЕТ SURVIVAL  ; в начало
	library(survival)			# подключение пакета SURVIVAL
	d<- data.frame(cbind(t,1))		# формирование матрицы из двух столбцов:
						#   t - моменты смерти
						#   столбец из 1, означающий, что во все моменты смерть была зафиксирована,
						#      ставьте 0 для моментов времени, в которые объект выбыл из наблюдения (был цензурирован)
	S<- survfit(Surv(X1,X2)~1,data=d)	
						# вычисление оценки Каплана-Майера для кривой дожития по цензурированным данным 
						# с 95% доверительным интервалом
						# 	здесь X1, X2 - имена столбцов матрицы d
	S<- survfit(Surv(X1,X2)~1,data=d,se.fit=F)
						# вычисление оценки Каплана-Майера для кривой дожития по цензурированным данным 
						# без 95% доверительного интервала
	plot(S)					# рисуется оценка кривой дожития 
	survdiff(Surv(X1,X2) ~ rx,data=d)	# проверяет по логранк тесту совпадение кривых дожития для данных, которым соответствуюя различные
						# уровни величины rx (фактора)


Модель Кокса для пропорционального риска (The Cox Proportional Hazards Model) в начало

	CMD<- coxph(Surv(X1,X2)~X3,data=d)	# построение модели Кокса с независимой переменной X3
	S<- survfit(CMD)			# вычисление дожития по построенной модели Кокса 
	CMD$loglik			# вектор из двух значений логарифма правдоподобия:
					#  первый - при нулевой гипотезе отсутствия влияния переменной X3
					#  второй - достигнутое значение логарифма правдоподобия

	survexp(формула,data=d)		# вычисляет кривую дожития для данных d по формуле (см. руководство)

  R - мощная, развивающаяся система для обработки реальных данных современными статистическими методами. 12.05.2017