#r
#r
Вопрос:
Допустим, у меня есть фрейм данных (изображение ниже), и я хочу разделить его на две новые категории в зависимости от региона, чтобы одна была BC, а другая NZ, как мне этого добиться? (в R) данные
Комментарии:
1. Добро пожаловать в Stack Overlow! В настоящее время ваши данные плохо отформатированы. Одним из многих хороших способов совместного использования данных является использование
dput()
функции в R. Например. если ваш фрейм данных именованdf
, вы можете использоватьdput(df)
2. каков ваш ожидаемый результат?
3. Вы хотите разделить его на два data.frames?
4. ну, я не уверен, нужны ли мне новые фреймы данных, намерение состоит в том, чтобы иметь возможность отображать переменные для обеих категорий позже. Понадобятся ли мне новые фреймы данных?
5. Нет, вы не хотите разделять его для составления заговора.
Ответ №1:
Вот пример с mtcars
данными, в котором мы используем переменную передачи am
для построения различных групп на диаграмме рассеяния с ggplot2
пакетом.
Мы создадим диаграмму рассеяния с переменной смещения по x
оси и милями на галлон по y
оси. Поскольку автомобили с большим рабочим объемом двигателя обычно потребляют больше бензина, чем автомобили с меньшим рабочим объемом, мы ожидаем увидеть отрицательную зависимость (миль на галлон выше при низких значениях рабочего объема) на графике.
Сначала мы преобразуем am
в факторную переменную, чтобы в легенде печатались две категории вместо континуума между 0 и 1. Затем мы используем ggplot()
и geom_point()
, чтобы задать цвет точки на основе значения am
.
library(ggplot2)
mtcars$am <- factor(mtcars$am,labels = c("automatic","manual"))
ggplot(mtcars,aes(disp,mpg,group = am))
geom_point(aes(color = am))
… и вывод:
Разделение диаграмм по группам с помощью фасетов
Мы можем использовать ggplot2
напрямую для создания отдельных диаграмм с помощью переменной группировки. В ggplot2
это известно как фасетная диаграмма. Мы используем facet_wrap()
для разделения данных по значениям am
следующим образом.
ggplot(mtcars,aes(disp,mpg,group = am))
geom_point()
facet_wrap(mtcars$am,ncol = 2)
… и вывод:
Добавление линии регрессии и доверительных интервалов
Учитывая комментарии в исходном вопросе, мы добавим линию регрессии к графику с помощью geom_smooth()
функции, которая по умолчанию использует сглаживание по умолчанию.
ggplot(mtcars,aes(disp,mpg,group = am))
geom_point()
facet_wrap(mtcars$am,ncol = 2)
geom_smooth(span = 1)
… и вывод:
Чтобы использовать простую регрессию вместо сглаживания по минимуму, мы используем method =
аргумент в geom_smooth()
и устанавливаем его равным lm
.
ggplot(mtcars,aes(disp,mpg,group = am))
geom_point()
facet_wrap(mtcars$am,ncol = 2)
geom_smooth(method = "lm")
… и вывод:
Генерировать регрессионные модели по группам
Здесь мы разделяем фрейм данных по значениям am
и используем lapply()
для генерации регрессионных моделей для каждой группы.
carsList <- split(mtcars,mtcars$am)
lapply(carsList,function(x){
summary(lm(mpg ~ disp,data = x))
})
… и вывод:
$automatic
Call:
lm(formula = mpg ~ disp, data = x)
Residuals:
Min 1Q Median 3Q Max
-2.7341 -1.6546 -0.8855 1.6032 5.0764
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 25.157064 1.592922 15.79 1.36e-11 ***
disp -0.027584 0.005146 -5.36 5.19e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.405 on 17 degrees of freedom
Multiple R-squared: 0.6283, Adjusted R-squared: 0.6064
F-statistic: 28.73 on 1 and 17 DF, p-value: 5.194e-05
$manual
Call:
lm(formula = mpg ~ disp, data = x)
Residuals:
Min 1Q Median 3Q Max
-4.6056 -2.4200 -0.0956 3.1484 5.2315
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 32.86614 1.95033 16.852 3.33e-09 ***
disp -0.05904 0.01174 -5.031 0.000383 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.545 on 11 degrees of freedom
Multiple R-squared: 0.6971, Adjusted R-squared: 0.6695
F-statistic: 25.31 on 1 and 11 DF, p-value: 0.0003834
ПРИМЕЧАНИЕ: поскольку это пример, иллюстрирующий код, необходимый для генерации регрессионного анализа с разделяемой переменной, мы не будем вдаваться в подробности о том, соответствуют ли приведенные здесь данные предположениям моделирования для обычной регрессии методом наименьших квадратов.
Моделирование групп в одной регрессионной модели
Как я отметил в комментариях, мы можем учесть различия между автоматической и механической коробками передач в одной регрессионной модели, если мы определим am
эффект, а также эффект взаимодействия между am
и disp
.
summary(lm(mpg ~ disp am am * disp,data=mtcars))
Мы можем продемонстрировать, что эта модель генерирует те же прогнозы, что и модель разделения для механических коробок передач, генерируя прогнозы из каждой модели следующим образом.
data <- data.frame(am = c(1,1,0),
disp = c(157,248,300))
data$am <- factor(data$am,labels = c("automatic","manual"))
mod1 <- lm(mpg ~ disp am am * disp,data=mtcars)
predict(mod1,data)
mod2 <- lm(mpg ~ disp,data = mtcars[mtcars$am == "manual",])
predict(mod2,data[data$am == "manual",])
… и вывод:
> data <- data.frame(am = c(1,1,0),
disp = c(157,248,300))
> data$am <- factor(data$am,labels = c("automatic","manual"))
> mod1 <- lm(mpg ~ disp am am * disp,data=mtcars)
> predict(mod1,data)
1 2 3
23.59711 18.22461 16.88199
> mod2 <- lm(mpg ~ disp,data = mtcars[mtcars$am == "manual",])
> predict(mod2,data[data$am == "manual",])
1 2
23.59711 18.22461
Мы подмножествуем данные до predict()
для модели разделения, чтобы генерировать прогнозы только для наблюдений, которые имели ручную передачу. Поскольку прогнозы совпадают, мы доказываем, что построение отдельных моделей по типу передачи ничем не отличается от полностью заданной модели, которая включает в себя как категориальный am
эффект, так и эффект взаимодействия для am * disp
.