R Language (Сковорцов) / Анализ данных на языке R
.pdfФункция cor.test () сравнивает только два значения за раз. Но что делать если необходимо сравнить множество значений попарно друг с другом? Для этого можно использовать функцию cor (), но она показывает только взаимосвязь пары переменных, не хватает р-уровня значимости для проверки гипотез. В пакете psych есть функция corr.test (), которая более полезная при проверке корреляции.
df <- mtcars
df_numeric <- df[, c(1,3:7)]
pairs(df_numeric)
cor(df_numeric)
fit <- corr.test(df_numeric) fit$r
fit$p fit$adjust
corr.test(df_numeric)
Перейдем к регрессионному анализу. Регрессионный анализ как и корреляция позволяет нам увидеть взаимосвязь двух количественных переменных. Но большой особенностью регрессионного анализа является способность объяснить как одна переменная предсказывает другую переменную. Функция lm () позволяет нам проводить регрессионный анализ.
fit <- lm(mpg ~ hp, df) summary(fit)
При визуализации данных мы тоже можем увидеть как именно взаимодействуют наши данные при помощи линии регрессии. Она строится добавлением geom_smooth и указанием в качестве аргумента метод линейной регрессии.
ggplot(df, aes(hp, mpg))+ geom_point(size = 5)+ geom_smooth(method = "lm")
Линия регрессии строится на основе предсказанных линейной регрессией значений. Эти предсказанные значения можно посмотреть в переменной fitted.values.
fitted_values_mpg <- data.frame(mpg = df$mpg, fitted = fit$fitted.values )
Регрессионная модель предсказывает только для переданных ей данных. Если в данных есть пропущенные значения или какая-то часть данных не попала в регрессионную модель, то можно использовать построенную регрессионную модель в функции predict (), которая поможет с этим разобраться.
new_hp <- data.frame(hp = c(100, 150, 129, 300)) new_hp$mpg <- predict(fit, new_hp)
predict(fit, new_hp)
Задание 9.1. Напишите функцию corr.calc, которая на вход получает data.frame с двумя количественными переменными, рассчитывает коэффициент корреляции Пирсона и возвращает
вектор из двух значений: коэффициент корреляции и p - уровень значимости.
Пример работы функции:
>corr.calc( mtcars[, c(1,5)] ) # на вход подаем данные mtcars только с переменными mpg и drat [1] 0.6811719078 0.0000177624
>corr.calc( iris[,1:2] ) # на вход подаем данные iris только с переменными Sepal.Length и Sepal.Width
[1] -0.1175698 0.1518983
Задание 9.2. Постройте линейную регрессию для одного из набора данных , где первая переменная - зависимая, вторая - независимая. В переменной my_reg_coef сохраните значения регрессионных коэффициентов.
Задание 9.3. Постройте scatterplot по данным iris, сохранив его в переменную my_plot :
Ось X - переменная Sepal.Width Ось Y - переменная Petal.Width Цвет точек - переменная Species
Также добавьте линейное сглаживание для каждой группы наблюдений по переменной Species.
10. Множественная линейная регрессия
Ранее мы строили линейную регрессию на основе одной зависимой переменной. Естественно, можно предсказывать на основе большего количества переменных. Мы точно так же, как и в регрессионном анализе, можем использовать различные виды формулы.
fit <- lm(Fertility ~ Examination + Catholic, data = swiss)
summary(fit)
fit2 <- lm(Fertility ~ Examination*Catholic, data = swiss)
summary(fit2)
Линейную регрессию можно строить не только с количественными независимыми переменными, но и с независимыми.
hist(swiss$Catholic, col = 'red')
swiss$confession <- ifelse(swiss$Catholic > 60, 'Catholic', 'Protestant')
swiss$confession <- as.factor(swiss$confession)
fit3 <- lm(Fertility ~ Examination + confession, data = swiss)
summary(fit3)
fit4 <- lm(Fertility ~ confession*Examination, data = swiss)
summary(fit4)
fit5 <- lm(Fertility ~ religious*Infant.Mortality*Examination, data = swiss) summary(fit5)
При составлении множественного регрессионного анализа необходимо понимать, что предсказанные значения для зависимой переменной могут получать разными в зависимости от используемых независимых переменных. Как выбрать наиболее правильную регрессионную модель обсудим дальше.
rm(swiss)
swiss <- data.frame(swiss)
fit_full <- lm(Fertility ~ ., data = swiss) summary(fit_full)
fit_reduced1 <- lm(Fertility ~ Infant.Mortality + Examination + Catholic + Education, data = swiss) summary(fit_reduced1)
Допустим, у нас есть две регрессионные модели: fitt_full и fit_reduced1. В первой модели у нас используются все используемые данные, а во второй одной из переменных не хватает. Чтобы понять какая из регрессионных моделей наиболее точно предсказывает значения зависимой переменной, воспользуемся функцией anova (). Из результатов мы видим, что