Октябрь 1

RStudio – день первый

Как обещал, выкладываю протокол сегодняшних занятий. Результаты работы программы можно посмотреть по ссылке или ниже.

Задание на самопроверку усвоенного.

Установите генератор случайных чисел командой

set.seed(2016)

Сгенерируйте случайную нормально распределенную последовательность с математическим ожиданием 2 и стандартным отклонением 3 из 1000 элементов и сохраните её в векторе x. Сделайте случайную выборку из этого вектора из 100 элементов в вектор y. Определите основные статистики (квартили, среднее), постройте гистограмму.

Ответ для самопроверки

Важно! Цифры должны полностью совпасть

    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-6.61200 -0.06354  2.42500  1.91500  4.01900  9.90900 

rplot

Если не получилось, попробуйте еще раз. Если совсем запутались – код в конце статьи.

Атомарные типы данных в R

Рассмотрим простые операции в R

x<-5
x
## [1] 5
x+1
## [1] 6
str(x)
##  num 5
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       5       5       5       5       5       5
y<-"Какой-то текст"
str(y)
##  chr "Какой-то текст"
summary(y)
##    Length     Class      Mode 
##         1 character character

Ничего сложного, но и интересного мы тоже не видим.

Предположим, что у нас есть рост студентов.Опишем два вектора, в одном пусть у нас будет рост, в другом,соответственно, пол.

x<-c(187,150,150,171,172,185,161,180,178)
y<-c("м","ж","ж","ж","ж","м","ж","м","м")
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   150.0   161.0   172.0   170.4   180.0   187.0
summary(y)
##    Length     Class      Mode 
##         9 character character
sort(x)
## [1] 150 150 161 171 172 178 180 185 187

Последняя команда сортирует вектор x. Справку о любой команде всегда можно получить набрав перед ней вопрос.

?sort

Работа с таблицами данных

Соберем два вектора в таблицу

MyTable<-data.frame(x,y)
MyTable
##     x y
## 1 187 м
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 6 185 м
## 7 161 ж
## 8 180 м
## 9 178 м
summary(MyTable)
##        x         y    
##  Min.   :150.0   ж:5  
##  1st Qu.:161.0   м:4  
##  Median :172.0        
##  Mean   :170.4        
##  3rd Qu.:180.0        
##  Max.   :187.0

К любому элементу таблицы можно обратиться по индексу

MyTable[1,1]
## [1] 187
MyTable[1,2]
## [1] м
## Levels: ж м
MyTable[1,]
##     x y
## 1 187 м
MyTable[,1]
## [1] 187 150 150 171 172 185 161 180 178
MyTable[,2]
## [1] м ж ж ж ж м ж м м
## Levels: ж м

Можно обратиться по имени колонки

MyTable$x
## [1] 187 150 150 171 172 185 161 180 178
MyTable$y[2]
## [1] ж
## Levels: ж м

Мы можем определить размеры любой таблицы

dim(MyTable)
## [1] 9 2
nrow(MyTable)
## [1] 9
ncol(MyTable)
## [1] 2

И сделать из неё выборку с помощью команды sample.

Как это делается? Созадим вектор, содержащий индексы элементов и присвоим случайную выборку вектору i. Обратите внимание, поскольку каждый раз у нас получается случайное число, то результаты могли бы быть различными, если вы запустили бы это файл у себя на компьютере. Чтобы это избежать командой set.seed я настроил генератор случайных чисел.

set.seed(2016)
k<-1:9
i<-sample(k,5)

Сделаем случайную выборку и выберем оставшиеся элементы

MyTable[i,]
##     x y
## 2 150 ж
## 9 178 м
## 6 185 м
## 1 187 м
## 3 150 ж
MyTable[-i,]
##     x y
## 4 171 ж
## 5 172 ж
## 7 161 ж
## 8 180 м
test<-MyTable[i,]
test2<-MyTable[-i,]
test
##     x y
## 2 150 ж
## 9 178 м
## 6 185 м
## 1 187 м
## 3 150 ж
test2
##     x y
## 4 171 ж
## 5 172 ж
## 7 161 ж
## 8 180 м

А что делать, если нам нужно выбрать конкретные значения из таблицы?

subset(MyTable,x>180)
##     x y
## 1 187 м
## 6 185 м
subset(MyTable,y=="ж")
##     x y
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 7 161 ж
subset(MyTable,y!="ж")
##     x y
## 1 187 м
## 6 185 м
## 8 180 м
## 9 178 м
subset(MyTable,y!="ж" & x>180)
##     x y
## 1 187 м
## 6 185 м

А можно то же самое записать иначе:

MyTable[MyTable$x>180,]
##     x y
## 1 187 м
## 6 185 м
MyTable[MyTable$y=="ж",]
##     x y
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 7 161 ж
MyTable[MyTable$y!="ж",]
##     x y
## 1 187 м
## 6 185 м
## 8 180 м
## 9 178 м
MyTable[x>180 & MyTable$y!="ж",]
##     x y
## 1 187 м
## 6 185 м

Генерация случайных чисел

Случайные числа нормально распределенные и равномерно распределеные генерируются весьма просто:

rnorm(10)
##  [1] -1.1687190  1.2294454 -1.6122037 -0.6039044  1.1580314 -0.2707606
##  [7] -1.1179372 -1.3473558  0.4832675  0.1523950
runif(10)
##  [1] 0.5990604 0.1825765 0.6122207 0.9446349 0.4286494 0.6307481 0.8211219
##  [8] 0.1902182 0.8786831 0.8510993

Построение графиков

plot(x,xlab="Измерение",ylab="Рост, см")

0075401d-b185-4e85-b871-baca6e507e11

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов")

71f349c9-bfdf-4783-9cd6-aa9cb3902fc2

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=19)

1a4456dd-5fc8-438a-b6ec-297e5b51cf5c

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=19,col="red")

bfff3304-a567-426b-94be-00d3524d0396

hist(x)

5c7e5aea-e7e1-4534-ba98-b1476ee26ef6-1

hist(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=2,col="red",breaks=9)

a111a63f-47eb-44dd-b666-f8b54f475002

boxplot(x~y,data=MyTable)

600d66cc-f336-4f69-8ab6-62e008da33d5

По идее, наш данные должны быть распределены нормально. Проверим это с помощью теста Шапиро-Уилка.

shapiro.test(x)
## 
##  Shapiro-Wilk normality test
## 
## data:  x
## W = 0.90311, p-value = 0.2706
# Альтернативный вариант для таблицы
shapiro.test(MyTable$x)
## 
##  Shapiro-Wilk normality test
## 
## data:  MyTable$x
## W = 0.90311, p-value = 0.2706

Проверим его на нормальном и логнормальном распределении, что бы понять, как меняется p-value.

shapiro.test(rnorm(10))
## 
##  Shapiro-Wilk normality test
## 
## data:  rnorm(10)
## W = 0.95559, p-value = 0.7346
shapiro.test(rnorm(100))
## 
##  Shapiro-Wilk normality test
## 
## data:  rnorm(100)
## W = 0.97693, p-value = 0.07642
shapiro.test(rlnorm(100))
## 
##  Shapiro-Wilk normality test
## 
## data:  rlnorm(100)
## W = 0.70394, p-value = 6.667e-13

Для графического теста используется график квантилей

qqnorm(x,pch=19)
qqline(x)

4cdf477a-5668-4328-9532-5827f5230028

Сравним с графиками для нормального и логнормального распределения.

qqnorm(a<-rnorm(100),pch=19);qqline(a,col="red",lwd=3)

0dcb5342-5fec-4482-a1e7-545402d7bc53

qqnorm(a<-rlnorm(100),pch=19);qqline(a,col="red",lwd=3)

458b9d70-ada8-4dcc-b678-0ce939382465

Во втором случае, если мы логарифмируем число, то должны получить нормальное распределение.

qqnorm(log(a))

62d11ca6-e06e-4850-bb65-52488806d6e2

И напоминаю, чтобы загрузить данные из Excel через clipboard нужно выполнить команду.

mt<-read.table("clipboard",header=T)

Метки:

Опубликовано 01.10.2016 Тушавин В.А. в категории "Изучаем R и RStudio