データをリストにネストし、線形モデルをリストの各ティブルに追加し、回帰係数をリストの各レコードに追加し、2つの異なるggplotオブジェクトをリストの各レコードに追加する例があります。レコードごとに別々の図に回帰直線をプロットしたいと思います。geom_smoothに私が求めていることを正確に実行させることができますが、geom_ablineは、リスト内の各レコードに1つの図ごとに回帰を追加するように見えます(私の例には3つのレコードがあるため、各図に3行で、記録。
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>
最後の2行を実行すると、問題が発生します。plot1のgeom_smoothコードは、各レコードのデータを使用して各レコードに1つの図を作成し、各図に平滑化線を適用します。ただし、plot2のgoem_ablineはそうではありません。3つの図のそれぞれに3本の線すべて(各レコードから1本)をプロットしているように見えます。goem_ablineをgeom_smoothのように動作させる方法に関する提案は大いに評価されます。
map
あなたが使用している機能は、plot 2
ONLYマッピングしている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')
)
)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加