функции фильтра продолжают работать с отсутствующим аргументом данных - PullRequest
1 голос
/ 20 марта 2019

Я работаю над Marketing Mix Modeling и слежу за статьей

https://analyticsartist.wordpress.com/2014/01/31/adstock-rate-deriving-with-analytical-methods/

В статье определяется функция склада, как показано ниже:

adstock <- function(x, rate=0){
  return(as.numeric(filter(x=x, filter=rate, method="recursive")))
}

и далее использует nlsm из minpack.lm пакета в R, который вычисляет ставки и коэффициенты.

model1 <- nlsLM(Applications~b0 + b1 * adstock(Media1, r1) + b2 * adstock(Media2, r2) +
                  b3 * adstock(Media3, r3) + b4 * adstock(Media4, r4) + b5 * adstock(Media5, r5) +
                  b6 * adstock(Media6, r6) + b7 * adstock(Media7, r7),
                algorithm = "LM",
                start     = c(b0=   1, b1=   1, b2=   1, b3 = 1, b4 = 1, b5 =1, b6= 1, b7= 1, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0, r7=0),
                lower     = c(b0=-Inf, b1=-Inf, b2=-Inf, b3 = -Inf, b4 = -Inf, b5 =-Inf, b6= -Inf, b7= -Inf, r1=0, r2=0, r3=0, r4=0, r5=0, r6=0,     r7=0),
                upper     = c(b0= Inf, b1= Inf, b2= Inf, b3 = Inf, b4 = Inf, b5 =Inf, b6= Inf, b7= Inf, r1=0.5, r2=0.5, r3=0.5, r4=0.5, r5=0.5, r6=0.5, r7=0.5))

Тем не менее, модель продолжает отказывать со следующей ошибкой

Error in filter_(.data, .dots = compat_as_lazy_dots(...)) : 
argument ".data" is missing, with no default

Кажется, ошибка исходит от функции adstock, но я не уверен, как ее исправить.

Я действительно надеюсь, что кто-нибудь может помочь решить эту проблему.

Заранее большое спасибо !!

1 Ответ

1 голос
/ 20 марта 2019

(Это распространенный вопрос, но, поскольку я не могу найти дубликат, пока предоставлю ответ.)

Ошибка, которую вы видите здесь, связана с dplyr::filter, а не с вашейожидайте использовать: stats::filter.В какой-то момент вы должны были увидеть что-то похожее на следующее, когда вы загрузили dplyr:

library(dplyr)
# Attaching package: 'dplyr'
# The following objects are masked from 'package:stats':
#     filter, lag
# The following objects are masked from 'package:base':
#     intersect, setdiff, setequal, union

Они должны обойти это (и поощрять / заставлять при публикации пакетов в CRAN), чтобы при использовании небазовые функции.В общем, я бы подумал, что stats:: будет защищен от этого, но использование dplyr определенно его обязывает.

Так что исправление для вашего кода должно быть просто явным при использовании filter где-нибудь рядомdplyr:

adstock <- function(x, rate=0){
  return(as.numeric(stats::filter(x=x, filter=rate, method="recursive")))
}

FWIW, управление пространством имен R и грубая эквивалентность с более явными методами python:

R                          Python
----------------------     ----------------------
                           import pkgname         | explicit namespace use
pkgname::function(...)     pkgname.function(...)  |

                           import pkgname as p    | no R equivalent?
                           p.function(...)        |

library(pkgname)           import * from pkgname  | permissive namespace,
function(...)              function(...)          |   enables masking
...