簡體   English   中英

繪制嵌套列表中每條記錄的回歸線

[英]plotting regression line for each record in a nested list

我有一個示例將數據嵌入到列表中,為列表中的每個tibble添加線性模型,將回歸系數添加到列表中的每個記錄,並將2個不同的ggplot對象添加到列表中的每個記錄。 我想在每個記錄的單獨圖上繪制回歸線。 我可以得到geom_smooth來完成我所追求的目標,但geom_abline似乎為列表中的每個記錄添加一個回歸每個圖(我的示例有三個記錄,因此每個圖上有三行而不是每個所需的單行)記錄。

library(tidyverse)
library(purrr)
library(broom)
library(ggplot2)

iris_species <- iris %>%  
  group_by(Species) %>%  
  nest()

# build model functions
model <- function(iris) {
  lm(Sepal.Length ~ Sepal.Width, data = iris)
}

# map models to the tibble
iris_species <- iris_species %>% 
  mutate(model = map(data, model))

iris_species # look at the structure

# add glance and tidy results to list
iris_species <- iris_species %>% 
  mutate(t = map(model, tidy)
         )

# unnest tidy list
iris_species_g <- iris_species %>% 
  unnest(t) %>% 
  select(Species, term, estimate) %>% 
  spread(key = term, value = estimate) %>%
  select(Species, `(Intercept)`, Sepal.Width) 

# pain down a list for species and data
iris_species_list <- iris_species %>% 
  select(Species, data, model)

# join  
iris_species_coeffs <- left_join(iris_species_list, iris_species_g, by = 'Species')

# add figures to list
iris_species_figs <- iris_species_coeffs %>% 
  mutate(plot1 = map(data, ~ ggplot(., aes(x = Sepal.Width, y = Sepal.Length)) +
                       geom_point() + 
                       geom_smooth(se = TRUE, size = 1, color = 'grey')
                     ) 
         ) 

iris_species_figs <- iris_species_figs %>% 
  mutate(plot2 = map(data, ~ ggplot(., aes(x = Sepal.Width, y = Sepal.Length)) +
                      geom_point() +
                      geom_abline(intercept = `(Intercept)`, slope = Sepal.Width, color = 'blue')
                    )
         ) 

iris_species_figs

# make figures
iris_species_figs$plot1 # works as expected

iris_species_figs$plot2 # does not

以下是上述代碼的最終產品:

# A tibble: 3 x 7
  Species    data              model    `(Intercept)` Sepal.Width plot1    plot2   
  <fct>      <list>            <list>           <dbl>       <dbl> <list>   <list>  
1 setosa     <tibble [50 × 4]> <S3: lm>          2.64       0.690 <S3: gg> <S3: gg>
2 versicolor <tibble [50 × 4]> <S3: lm>          3.54       0.865 <S3: gg> <S3: gg>
3 virginica  <tibble [50 × 4]> <S3: lm>          3.91       0.902 <S3: gg> <S3: gg>

運行最后兩行顯示問題。 plot1中的geom_smooth代碼為每條記錄創建1個數字,其中包含每條記錄的數據,並將平滑線應用於每個數字。 但是,plot2中的goem_abline沒有。 它似乎在三個圖中的每一個上繪制所有3條線(每條記錄一條)。 關於如何讓goem_abline表現得像geom_smooth的任何建議都會非常適合。

您用於plot 2map函數僅映射data ,對於截距和斜率,它看到3個元素的向量。 這就是你在每個情節中看到3行的原因。

您必須使用pmap才能map每個繪圖需要使用的所有信息/列。

嘗試這個:

iris_species_figs <- iris_species_figs %>% 
  mutate(plot2 = pmap(list(data,`(Intercept)`,Sepal.Width), 
                      function(a,b,c) ggplot(a, aes(x = Sepal.Width, y = Sepal.Length)) +
                       geom_point() +
                       geom_abline(intercept = b, slope = c, color = 'blue')
  )
  ) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM