Создать тест выражения, чтобы увидеть, содержит ли as asformula ('X ~ 1') `в R перехват? - PullRequest
0 голосов
/ 28 апреля 2018

В R можно указать формулу:

F <- as.formula('X ~ 1')

Я пытаюсь найти способ проверить, содержит ли F выше только перехват, т. Е. ~ 1. Я пытался использовать grepl безрезультатно. Есть ли способ точно проверить, содержит ли приведенная выше формула только перехват? то есть, я надеюсь найти метод, который вернул бы true в следующих различных случаях:

F <- as.formula('X~ 1')
F <- as.formula('X~1')
F <- as.formula('X ~1')

также. Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

attr(terms(x~y), 'intercept') будет делать то, что вы хотите.

formula <- x~y
formula2 <- x~y-1 # no intercept
attr(terms(formula), 'intercept')
## [1] 1
attr(terms(formula2), 'intercept')
## [1] 0

РЕДАКТИРОВАТЬ: я изначально неправильно понял вопрос. Если вы ищете конкретный пример, который будет искать, содержит ли формула только перехват, вы можете использовать:

f1 <- x ~ y
f2 <- x ~ y-1
f3 <- x ~ 1
f3 <- x ~ 0

onlyIntercept <- function(f){
  return(attr(terms(f), 'intercept') & length(attr(terms(f), 'factors')) == 0)
}
# Examples on above, then on OPs examples:
onlyIntercept(f1)
## [1] FALSE
onlyIntercept(f2)
## [1] FALSE
onlyIntercept(f3)
## [1] TRUE
onlyIntercept(f4)
## [1] FALSE

onlyIntercept(as.formula('X~ 1'))
## [1] TRUE
onlyIntercept(as.formula('X~1'))
## [1] TRUE
onlyIntercept(as.formula('X ~1'))
## [1] TRUE

Функция onlyIntercept, которую я здесь определяю, проверяет, равен ли атрибут перехвата 0 или 1, и проверяет, есть ли какие-либо дополнительные факторы (переменные), которые обычно включаются в модель. Если его нет, этот атрибут имеет длину 0 и может быть легко проверен.

0 голосов
/ 28 апреля 2018

Вы можете использовать пакет lazyeval:

> F <- as.formula('X ~ 1')
> lazyeval::f_rhs(F)
[1] 1
0 голосов
/ 28 апреля 2018

Мы можем извлечь и проверить

F[[3]] == 1

потому что, если мы сделаем as.list, 3-й list элемент будет 1

as.list(F)
#[[1]]
# `~`

#[[2]] 
#X

#[[3]]
#[1] 1

вернет TRUE во всех 3 'F в посте ОП

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...