Создание фиктивных переменных в статистическом программировании - PullRequest
0 голосов
/ 06 апреля 2020

Я довольно новичок в статистическом программировании R, и у меня возникли некоторые проблемы при создании фиктивных переменных для перекодирования столбца данных. Ниже приведен фрагмент набора данных:

Годовой квартальный объем продаж ВНП 2002 1 696048 9740,5 2002 2 753211 9983,5 2002 3 746875 10048.0 2002 4 792622 10184,9 2003 1 704757 10206.2 2003 2 779011 10350.9 2003 3 756128 10332.2 2003 4 827829

Три новых столбца, которые я пытаюсь создать, это d1, d2 и d3. d1 - фиктивная переменная, равная 1, если 1 квартал, и 0 в противном случае, d2 - фиктивная переменная, равная 1, если 2 квартал и 0 в противном случае, и d3 - фиктивная переменная, равная 1, если квартал 3 и 0 в противном случае.

Я использую приведенный ниже код R, чтобы попытаться выполнить sh this:

d1 <- ifelse(Quarter == 1, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d1)
d2 <- ifelse(Quarter == 2, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d2)
d3 <- ifelse(Quarter == 3, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d3)

Однако при просмотре новых столбцов все значения равны 0? d1 должен равняться 1, если квартал 1, но равен 0. Какая часть моего кода должна быть пересмотрена для достижения sh этого?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2020

Обычно при построении линейных моделей в R вам не нужно создавать матрицу модели самостоятельно. Скорее вы можете просто указать Quarter как фактор, и lm сгенерирует матрицу модели для вас. Вот два способа сделать это. Мы показали матрицу модели, чтобы вы могли видеть, как она выглядит, но кроме этого вам, вероятно, не нужно явно генерировать ее.

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

# test data
Quarter <- c(1, 1, 2, 2, 3, 3, 4, 4); Sales <- 1:8

Qtr <- factor(Quarter)
fm <- lm(Sales ~ Qtr + 0)

model.matrix(fm)
##   Qtr1 Qtr2 Qtr3 Qtr4
## 1    1    0    0    0
## 2    1    0    0    0
## 3    0    1    0    0
## 4    0    1    0    0
## 5    0    0    1    0
## 6    0    0    1    0
## 7    0    0    0    1
## 8    0    0    0    1

Qtr <- relevel(factor(Quarter), 4)
fm2 <- lm(Sales ~ Qtr)
model.matrix(fm2)
##   (Intercept) Qtr1 Qtr2 Qtr3
## 1           1    1    0    0
## 2           1    1    0    0
## 3           1    0    1    0
## 4           1    0    1    0
## 5           1    0    0    1
## 6           1    0    0    1
## 7           1    0    0    0
## 8           1    0    0    0
0 голосов
/ 06 апреля 2020

Мы можем использовать model.matrx

df1[paste0('dummy_cols', 1:4)] <- model.matrix(~ factor(df1$Quarter)-1)
df1
# Year Quarter  Sales     GNP dummy_cols1 dummy_cols2 dummy_cols3 dummy_cols4
#1 2002       1 696048  9740.5           1           0           0           0
#2 2002       2 753211  9983.5           0           1           0           0
#3 2002       3 746875 10048.0           0           0           1           0
#4 2002       4 792622 10184.9           0           0           0           1
#5 2003       1 704757 10206.2           1           0           0           0
#6 2003       2 779011 10350.9           0           1           0           0
#7 2003       3 756128 10332.2           0           0           1           0
#8 2003       4 827829 10463.1           0           0           0           1

данные

df1 <- structure(list(Year = c(2002L, 2002L, 2002L, 2002L, 2003L, 2003L, 
2003L, 2003L), Quarter = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Sales = c(696048L, 
753211L, 746875L, 792622L, 704757L, 779011L, 756128L, 827829L
), GNP = c(9740.5, 9983.5, 10048, 10184.9, 10206.2, 10350.9, 
10332.2, 10463.1)), class = "data.frame", row.names = c(NA, -8L
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...