model.matrix 适用于 df 的 "month" 列,但为 "week" 列提供意外输出
model.matrix works for "month" column of df but gives unexpected output for "week" column
我正在尝试使用 model.matrix
构建模型矩阵。这是我的数据,存储为名为 wILI
:
的数据框
date value week month year
1997-10-01 0.002734167 1 10 1997
1997-10-08 0.003612784 2 10 1997
1997-10-15 0.004757731 3 10 1997
1997-10-22 0.006238000 4 10 1997
1997-10-29 0.008132015 5 10 1997
1997-11-05 0.010522688 6 11 1997
1997-11-12 0.013487294 7 11 1997
1997-11-19 0.017080349 8 11 1997
1997-11-26 0.021308731 9 11 1997
1997-12-03 0.026101156 10 12 1997
1997-12-10 0.031279133 11 12 1997
1997-12-17 0.036542190 12 12 1997
1997-12-24 0.041482753 13 12 1997
1997-12-31 0.045640193 14 12 1997
1998-01-07 0.048587584 15 01 1998
1998-01-14 0.050025386 16 01 1998
1998-01-21 0.049847167 17 01 1998
1998-01-28 0.048152678 18 01 1998
1998-02-04 0.045207680 19 02 1998
1998-02-11 0.041371773 20 02 1998
1998-02-18 0.037022686 21 02 1998
1998-02-25 0.032498271 22 02 1998
1998-03-04 0.028064335 23 03 1998
1998-03-11 0.023905745 24 03 1998
1998-03-18 0.020133246 25 03 1998
1998-03-25 0.016798043 26 03 1998
1998-04-01 0.013908254 27 04 1998
1998-04-08 0.011443810 28 04 1998
1998-04-15 0.009368329 29 04 1998
1998-04-22 0.007637759 30 04 1998
1998-04-29 0.006206186 31 04 1998
1998-05-06 0.005029414 32 05 1998
1998-05-13 0.004066965 33 05 1998
1998-05-20 0.003282970 34 05 1998
1998-05-27 0.002646398 35 05 1998
我正在测试 wILI 数据的两个模型,一个带有月回归量,另一个带有周回归量。也就是说,我想要每个月(模型 1)和每周(模型 2)的系数。对于上述数据,可能的月份是 1,2,3,4,5,10,11,12,可能的周是 1,2,...,35。当我使用 model.matrix(~ 0 + month, wILI)
时,它按预期工作:
month01 month02 month03 month04 month05 month10 month11 month12
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
第 i 行的元素在其对应月份的列中为 1,在所有其他列中为零,正如我想要的那样。但是当我使用“周”而不是“月”尝试同样的事情时,我得到了这个:
week
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
……嗯??为什么我得到一个 35x1 的向量?我想要一个 35x35 矩阵,其中第一行在第一列中有一个 1,其他所有地方都为零,第二行在第二列中有一个 1,其他所有地方都为零,第三行在第三列中有一个 1,其他地方都为零等(即 35x35 单位矩阵)。关于如何实现这一目标的任何建议?为什么只需将“月”更改为“周”,输出结果就会如此不同?
确保周和月是因子(或字符)。数值预测变量成为模型矩阵中的单列,而因子为每个级别生成一列,如果有截距,则除一个级别外的所有级别生成一列。如果该列已经是因子或字符,则可以省略变量周围的因子(...)。
model.matrix(~ factor(month) + 0, wILI)
model.matrix(~ factor(week) + 0, wILI)
另一种给出更好的系数名称的写法是:
model.matrix(~ month + 0, transform(wILI, month = factor(month)))
model.matrix(~ week + 0, transform(wILI, week = factor(week)))
我正在尝试使用 model.matrix
构建模型矩阵。这是我的数据,存储为名为 wILI
:
date value week month year
1997-10-01 0.002734167 1 10 1997
1997-10-08 0.003612784 2 10 1997
1997-10-15 0.004757731 3 10 1997
1997-10-22 0.006238000 4 10 1997
1997-10-29 0.008132015 5 10 1997
1997-11-05 0.010522688 6 11 1997
1997-11-12 0.013487294 7 11 1997
1997-11-19 0.017080349 8 11 1997
1997-11-26 0.021308731 9 11 1997
1997-12-03 0.026101156 10 12 1997
1997-12-10 0.031279133 11 12 1997
1997-12-17 0.036542190 12 12 1997
1997-12-24 0.041482753 13 12 1997
1997-12-31 0.045640193 14 12 1997
1998-01-07 0.048587584 15 01 1998
1998-01-14 0.050025386 16 01 1998
1998-01-21 0.049847167 17 01 1998
1998-01-28 0.048152678 18 01 1998
1998-02-04 0.045207680 19 02 1998
1998-02-11 0.041371773 20 02 1998
1998-02-18 0.037022686 21 02 1998
1998-02-25 0.032498271 22 02 1998
1998-03-04 0.028064335 23 03 1998
1998-03-11 0.023905745 24 03 1998
1998-03-18 0.020133246 25 03 1998
1998-03-25 0.016798043 26 03 1998
1998-04-01 0.013908254 27 04 1998
1998-04-08 0.011443810 28 04 1998
1998-04-15 0.009368329 29 04 1998
1998-04-22 0.007637759 30 04 1998
1998-04-29 0.006206186 31 04 1998
1998-05-06 0.005029414 32 05 1998
1998-05-13 0.004066965 33 05 1998
1998-05-20 0.003282970 34 05 1998
1998-05-27 0.002646398 35 05 1998
我正在测试 wILI 数据的两个模型,一个带有月回归量,另一个带有周回归量。也就是说,我想要每个月(模型 1)和每周(模型 2)的系数。对于上述数据,可能的月份是 1,2,3,4,5,10,11,12,可能的周是 1,2,...,35。当我使用 model.matrix(~ 0 + month, wILI)
时,它按预期工作:
month01 month02 month03 month04 month05 month10 month11 month12
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0
第 i 行的元素在其对应月份的列中为 1,在所有其他列中为零,正如我想要的那样。但是当我使用“周”而不是“月”尝试同样的事情时,我得到了这个:
week
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
……嗯??为什么我得到一个 35x1 的向量?我想要一个 35x35 矩阵,其中第一行在第一列中有一个 1,其他所有地方都为零,第二行在第二列中有一个 1,其他所有地方都为零,第三行在第三列中有一个 1,其他地方都为零等(即 35x35 单位矩阵)。关于如何实现这一目标的任何建议?为什么只需将“月”更改为“周”,输出结果就会如此不同?
确保周和月是因子(或字符)。数值预测变量成为模型矩阵中的单列,而因子为每个级别生成一列,如果有截距,则除一个级别外的所有级别生成一列。如果该列已经是因子或字符,则可以省略变量周围的因子(...)。
model.matrix(~ factor(month) + 0, wILI)
model.matrix(~ factor(week) + 0, wILI)
另一种给出更好的系数名称的写法是:
model.matrix(~ month + 0, transform(wILI, month = factor(month)))
model.matrix(~ week + 0, transform(wILI, week = factor(week)))