Как мне разделить данные в R по категориям

#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 .