Труба "."точка вызывает проблемы в вызове GLM - PullRequest
0 голосов
/ 06 июля 2019

Канал dplyr не передает имя объектов, переданных по цепочке.Это хорошо известно.Однако это приводит к неожиданным осложнениям после установки модели glm.Функции, использующие объекты glm, ожидают, что вызов будет содержать правильное имя объекта, содержащего данные.

    #sample data
    p_load(ISLR)
    mydata = ISLR::Default

    #fit glm
    fitted=
    mydata %>% 
      select(default, income) %>%
      glm(default~.,data=.,family=binomial) 

    #dot in call
    fitted$call

    #pscl's pR2 pseudo r2 function does not work
    p_load(pscl)
    pR2(fitted)

Как исправить это поведение?Я хочу продолжать использовать трубы, включая функцию select.Я также хочу получить возражение glm в fitted, которое можно использовать с pR2 или другой функцией, для которой требуется рабочий вызов.

Можно переставить предварительную обработку данных в вызов glm, ноэто убирает элегантность кода.

fitted=
  glm(default~.,
      data=mydata %>%
        select(default, income),
      family=binomial) 

1 Ответ

2 голосов
/ 07 июля 2019

1) Поскольку вы в явном виде выписываете все переменные в select, вы можете так же легко записать их в формулу и избавиться от select - вы можетеоставьте select, если хотите, но это кажется бессмысленным, если переменные уже явно указаны в формуле.Тогда это работает:

library(dplyr)
library(magrittr)
library(pscl)
library(ISLR)

fitted <- Default %$% glm(default ~ income, family=binomial)

fitted %>% pR2

2) Другая возможность состоит в том, чтобы инвертировать его так, чтобы вместо помещения glm внутрь трубы поместить трубу внутри glm:

fitted <- 
  glm(default ~ ., data = Default %>% select(income, default), family = binomial)

fitted %>% pR2

3) Третий подход заключается в создании аргумента formula для glm вместо аргумента data.

fitted <- Default %>% 
  select(starts_with("inc")) %>% 
  names %>% 
  reformulate("default") %>%
  glm(data = Default, family = binomial)

fitted %>% pR2

Замените glmСтрока с этим, если важно, чтобы строка Call: в выводе выглядела хорошо.

{ do.call("glm", list(., data = quote(Default), family = quote(binomial))) }

или использование purrr:

{ invoke("glm", list(., data = expr(Default), family = expr(binomial))) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...