Создайте фиктивную переменную

У меня возникли проблемы с созданием следующих фиктивных переменных в R:

Я анализирую годовой временной ряд данных (период времени 1948-2009). У меня есть два вопроса:

  1. Как создать фиктивную переменную для наблюдения №10, т.е. для 1957 года (значение = 1 в 1957 году и ноль в противном случае)?

  2. Как создать фиктивную переменную, которая равна нулю до 1957 года и принимает значение 1 с 1957 года и далее до 2009 года?

Другой вариант, который может работать лучше, если у вас много переменных, это factor и model.matrix.

> year.f = factor(year)
> dummies = model.matrix(~year.f)

Это будет включать столбец перехвата (все единицы) и один столбец для каждого года в вашем наборе данных, кроме одного, который будет значением "по умолчанию" или значением перехвата.

Вы можете изменить способ выбора значения "по умолчанию", изменяя contrasts.arg в model.matrix.

Также, если вы хотите опустить перехват, вы можете просто опустить первый столбец или добавить +0 в конец формулы.

Надеюсь, это будет полезно.

Комментарии (10)

Простейший способ получения этих фиктивных переменных заключается в следующем:

> print(year)
[1] 1956 1957 1957 1958 1958 1959
> dummy  print(dummy)
[1] 0 1 1 0 0 0
> dummy2 = 1957)
> print(dummy2)
[1] 0 1 1 1 1 1

В более общем случае, вы можете использовать ifelse для выбора между двумя значениями в зависимости от условия. Так, если вместо фиктивной переменной 0-1 по какой-то причине вы хотите использовать, скажем, 4 и 7, вы можете использовать ifelse(year == 1957, 4, 7).

Комментарии (0)

Млр пакет включает createDummyFeatures для этой цели:


library(mlr)
df 
Комментарии (2)

Других ответов здесь предлагаем прямые маршруты для выполнения этой задачи—одно, что многие модели (например, лм) будет делать для вас все равно внутренне. Тем не менее, вот несколько способов сделать фиктивные переменные с Максом Куна'ы популярных каре и ["рецепты"] (https://topepo.github.io/recipes/) пакеты. В то время как несколько более многословный, они легко масштабируются в более сложных ситуациях, и вписываются в их рамки.


каре::dummyVars

С каре, соответствующая функция dummyVars, который есть предсказать метод, чтобы применить его на фрейм данных:

в

df  
#> Formula: ~.
#> 2 variables, 1 factors
#> Variables and levels will be separated by '.'
#> A full rank encoding is used

predict(dummy, df)
#>   letter.b letter.c y
#> 1        0        0 1
#> 2        0        0 2
#> 3        1        0 3
#> 4        1        0 4
#> 5        0        1 5
#> 6        0        1 6

рецепты::step_dummy

С "рецептами", соответствующие функции step_dummy:

library(recipes)

dummy_recipe % 
    step_dummy(letter)

dummy_recipe
#> Data Recipe
#> 
#> Inputs:
#> 
#>       role #variables
#>    outcome          1
#>  predictor          1
#> 
#> Steps:
#> 
#> Dummy variables from letter

В зависимости от контекста, извлечь данные с подготовки и пекут или сок:

# Prep and bake on new data...
dummy_recipe %>% 
    prep() %>% 
    bake(df)
#> # A tibble: 6 x 3
#>       y letter_b letter_c
#>           
#> 1     1        0        0
#> 2     2        0        0
#> 3     3        1        0
#> 4     4        1        0
#> 5     5        0        1
#> 6     6        0        1

# ...or use `retain = TRUE` and `juice` to extract training data
dummy_recipe %>% 
    prep(retain = TRUE) %>% 
    juice()
#> # A tibble: 6 x 3
#>       y letter_b letter_c
#>           
#> 1     1        0        0
#> 2     2        0        0
#> 3     3        1        0
#> 4     4        1        0
#> 5     5        0        1
#> 6     6        0        1
Комментарии (0)

Для работы с такими фиктивными переменными я обычно делаю следующее:

(1) как мне создать фиктивную переменную для наблюдения №10, т.е. для 1957 года (значение = 1 в 1957 году и ноль в противном случае).


data$factor_year_1 
Комментарии (0)

Для usecase, как это представлено в вопросе, вы также можете просто умножить логическое условие с 1 (или, может быть, даже лучше, С ):


# example data
df1 
Комментарии (0)

Я читал это на форуме kaggle:


#Generate example dataframe with character column
example 
Комментарии (0)

Если вы хотите получить к дамми, а не к-1, Попробуйте:

dummies = table(1:length(year),as.factor(year))  

Лучшие,

Комментарии (1)

В <а href="https://stat.ethz.ch/R-manual/R-devel/library/base/html/ifelse.html">`ifelse` функция лучше для простой логики такой.

> x   [1] 1 1 1 1 1 1 1 1 0 0 0

Также, если вы хотите вернуть данные персонажа, то вы можете сделать это.

> x   [1] "foo" "foo" "foo" "foo" "foo" "foo" "foo" "foo" "bar" "bar" "bar"

Категориальные переменные с раскроя...

> x   [1] "baz" "baz" "baz" "baz" "baz" "baz" "baz" "foo" "bar" "baz" "baz"

Это самый простой вариант.

Комментарии (0)

Другим способом является использование mtabulate из пакета qdapTools, т. е.


df 
Комментарии (0)

Я использую такую функцию (для данных.таблицу):

# Ta funkcja dla obiektu data.table i zmiennej var.name typu factor tworzy dummy variables o nazwach "var.name: (level1)"
factorToDummy  new.names
  dtable[, (new.names) := transpose(lapply(get(var.name), FUN = function(x){x == levels(get(var.name))})) ]

  cat(paste("\nDodano zmienne dummy: ", paste0(new.names, collapse = ", ")))
}

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


data 
Комментарии (0)

Конвертировать данные в данных.стол и использовать набор по ссылке и фильтрации строк


library(data.table)

dt 
Комментарии (0)

Мы также можем использовать cSplit_e от splitstackshape. Используя @zx8754'данных


df1 
Комментарии (0)

другой способ вы можете сделать это использовать

ifelse(year < 1965 , 1, 0)
Комментарии (0)

Привет я написал это общие функции создается переменная, которая по существу повторяет функции замены в stata.

Если X-это фрейм данных X и я хочу переменная под названием "А", которая будет принимать значение 1 При х$б принимает значение с


introducedummy
Комментарии (0)