Язык R Отчет (Скворцов) / Анализ данных на языке R
.pdfmy_calc_3 |
<- |
function(x, y, z = 10){ |
|||
s |
<- |
x + y |
+ |
z |
|
d |
<- |
x |
- y |
- |
z |
return(c(s, |
d)) |
||||
} |
|
|
|
|
|
Перейдем к построению функций, которые ближе к анализу данных. Например, заменим пропущенные значения в какой-то выборке, на среднее значение. В одной из прошлых лабораторных работ эта операция выполнялась примерно так:
distr1 <- rnorm(100) distr1[1:30] <- NA
distr1[is.na(distr1)] <- mean(distr1, na.rm = T)
Но если использовать какую-то другую переменную, то придется опять полностью переписывать команду. Поэтому создадим функцию, которая вне зависимости от введенных данных будет выполнять необходимую нам операцию.
my_na_rm <- function(x){ x[is.na(x)] <- mean(x, na.rm = T)
}
Теперь, если мы на вход подадим числовой вектор с пропущенными значениями, функция выполнит необходимую нам операцию. Однако, если на вход подается вектор строкового типа, то получится ошибка. Перепишем:
my_na_rm <- function(x){
if (is.numeric(x)){
x[is.na(x)] <- mean(x, na.rm = T) return(x)
}else{
print("X is not numeric")
}
}
Что еще можно сделать? Давайте проверим входящий числовой вектор на нормальность распределения. Если распределение не отклоняется от нормального, то пропущенные значения заменим на среднее, иначе на медиану.
my_na_rm <- function(x){ if (is.numeric(x)){
stat_test <- shapiro.test(x) if (stat_test$p.value > 0.05){
x[is.na(x)] |
<- |
mean(x, na.rm = |
T) |
} else{ |
|
|
|
x[is.na(x)] |
<- |
median(x, na.rm |
= T) |
}
return(x) } else{
print("X is not numeric")
}
}
Что ж, теперь мы не можем узнать, на что именно были заменены пропущенные значения. Поэтому дополним функцию.
my_na_rm <- function(x){ if (is.numeric(x)){
stat_test <- shapiro.test(x) if (stat_test$p.value > 0.05){
x[is.na(x)] <- mean(x, na.rm = T) print("NA values were replaced with mean")
}else{
x[is.na(x)] <- median(x, na.rm = T) print("NA values were replaced with median")
}
return(x)
}else{
print("X is not numeric")
}
}
d1 <- rnorm(2000)
d2 <- runif(2000)
d1[1:10] <- NA d2[1:10] <- NA
d1 <- my_na_rm(d1) head(d1)
d2 <- my_na_rm(d2) head(d2)
Задание 8.1. Напишите функцию, которая выводит номера позиций пропущенных наблюдений в векторе.
На вход функция получает числовой вектор с пропущенными значениями. Функция возвращает новый вектор с номерами позиций пропущенных значений.
Задание 8.2. Напишите функцию filtered.sum, которая на вход получает вектор с пропущенными, положительными и отрицательными значениями и возвращает сумму положительных элементов вектора.
9. Корреляция и простая линейная регрессия
Корреляция позволяет нам понять как две количественные переменные влияют друг на друга. Например, при увеличении одной переменной другая уменьшается (например, с увеличением возраста физическая активность снижается, хотя при взгляде на бабок в автобусах это не скажешь) мы понимаем, что это отрицательная корреляция. Естественно, если обе переменные увеличиваются (например, при покупке квартиры большей площади мы должны заплатить больше денег) - то корреляция положительна.
df <- mtcars
Для расчета корреляции в R существует различные функции. Самой простой из них является функция cor.test (). В качестве основных аргументов выступают две сравниваемые переменные. Дополнительно можно использовать аргумент method, при помощи которого можно использовать не коэффициент корреляции Пирсона, а коэффициент корреляции Кендалла или коэффициент корреляции Спирмена.
fit <- cor.test(x = df$mpg, y = df$hp)
Естественно то же самое можно записать формулой.
cor.test(~ mpg + hp, df)
str(fit)