将因子列拆分为R

时间:2019-02-07 13:18:10

标签: r tidyr lm elementwise-operations

我想将每次观察的回归系数与实际变量相乘。如果没有因素,我可以通过将元素矩阵的变量矩阵乘以系数向量来实现。

v_coef <- as.matrix(vars) %*% as.matrix(coef)

但是,我面临的问题是我的变量之一是一个因素。因此,回归返回与虚拟变量关联的多个系数(每年一个,不包括一年)。因此,上面的代码行不再起作用,因为多个系数与变量矩阵中的同一列相关联。

### Working example
# Make up dataframe
df      <- data.frame(matrix(rnorm(6*1000, 1, .5), ncol=6))
# Make up some years (3)
df$year <- c(rep(1,333),rep(2,333),rep(3,334))
# Regress something with years as factor
model   <- lm(X1~X2+X3+X4+X5+X6+factor(year),data=df)
# This does not work because years receive 3 coefficients for 1 column
m_coef  <- as.matrix(df) %*% as.matrix(model$coefficients)

但是,我看到两个解决方案无法弄清楚如何实现它们。要么,我将因子列拆分为几列,除适用年份外,所有年份均为0,当年的观测值则为1。或者,我更改矩阵乘法,然后将系数分配给因子的不同值

1 个答案:

答案 0 :(得分:2)

df      <- data.frame(matrix(rnorm(6*1000, 1, .5), ncol=6))

year <- c(rep(1,333),rep(2,333),rep(3,334))
df$year1 = ifelse(year == 1, 1, 0)
df$year2 = ifelse(year == 2, 1, 0)

model  <- lm(X1~X2+X3+X4+X5+X6+year1+year2,data=df)

m_coef  <- as.matrix(df) %*% model$coefficients

为因子级别添加虚拟变量-您不需要指定year3,因为它由case year1 == 0和year2 == 0表示。还可以在矩阵乘法中将as.matrix添加到df。

编辑:对于较大的因素,请使用model.matrix()

dummies = model.matrix(~as.factor(year))[,-1]

第一列是截距,如前所述,截距可以由其他列指定。