7

私はpurrrパラダイムに不慣れで、苦労しています。

データ フレームをネストし、ネストされたデータで線形モデルを実行し、各 lm からいくつかの係数を抽出し、各 lm の要約を生成するために、私がなんとか取得したいくつかのソースに従ってください。私がやりたい最後のことは、要約から「r.squared」を抽出することです(これは、私が達成しようとしていることの最も単純な部分だと思います)が、何らかの理由で構文を取得できません右。

これが私が持っているもののMWEです。

library(purrr)
library(dplyr)
library(tidyr)

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         sum = map(fit, ~summary))

そして、失敗した r.squared を抽出する私の試みは次のとおりです。

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         sum = map(fit, ~summary),
         rsq = map_dbl(sum, "r.squared"))
Error in eval(substitute(expr), envir, enclos) : 
  `x` must be a vector (not a closure)

これは、RStudio サイトにある例と表面的には似ています。

mtcars %>%
  split(.$cyl) %>%
  map(~ lm(mpg ~ wt, data = .x)) %>%
  map(summary) %>%
  map_dbl("r.squared")

これは機能しますが、r.squared 値を新しい列に配置して (したがって mutate ステートメント)、問題を回避するのではなく、コードが機能しない理由を理解したいと考えています。

編集:

以下のソリューションを使用することになった実用的なソリューションを次に示します。

mtcars %>%
      nest(-cyl) %>% 
      mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
             summary = map(fit, glance),
             r_sq = map_dbl(summary, "r.squared"))

編集2:

したがって、実際には、このバグは summary = map(fit, ~summary) 行にチルダ キーが含まれていることが原因であることがわかります。私の推測では、オブジェクトは、要約自体によって返されるオブジェクトではなく、ネストされた関数になります。誰かが参加したい場合は、これに関する信頼できる回答が欲しい.

明確にするために、元のコードのこのバージョンは正常に動作します。

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, summary),
         r_sq = map_dbl(summary, "r.squared"))
4

3 に答える 3

6

現在のパイプに収まるように、パッケージと一緒に、またはパッケージから使用することをお勧めunnestします。mapglancebroom

library(tidyr)
library(dplyr)
library(broom)

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .))) %>% 
  unnest(map(fit, glance))

r-squared だけでなく、そこからselect必要のないものを削除するために使用できます。

リスト列にネストされたモデルの要約を保持する場合:

mtcars %>%
  nest(-cyl) %>% 
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, glance)) 

ネストされたフレームから単一の値を抽出するだけの場合はmap、実際の値を使用する必要があります ([[最初extract2に提案したように、それを見つけてくれてありがとう)。

mtcars %>%
  nest(-cyl) %>% 
  mutate(fit = map(data, ~lm(mpg ~ wt, data = .)),
         summary = map(fit, glance),
         r_sq = map_dbl(summary, "r.squared"))
于 2016-12-02T13:33:41.197 に答える
5

あなたが達成したいことのために、パッケージのglance()関数を使用する方が良いと思います:broom

library(broom)
library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  do(glance(lm(mpg ~ wt, data = .))) %>%
  select(cyl, r.squared)
#    cyl r.squared
#  <dbl>     <dbl>
#1     4 0.5086326
#2     6 0.4645102
#3     8 0.4229655
于 2016-12-02T10:59:34.303 に答える