当响应变量的名称是客户ID时,在data.table中运行lm

时间:2014-07-08 07:21:06

标签: r data.table lm

给出以下数据示例:

library(data.table)
set.seed(1000)
y.dt <- data.table("100197"=rnorm(6), "100198"=rnorm(6), "100199"=rnorm(6))
x.dt <- data.table("PC1" = rnorm(6), "PC2" = rnorm(6), "PC3" = rnorm(6))

y.dt中的数字代表每个客户ID。我想为每个客户构建线性模型。 (如果我可以同时做所有事情那就太好了)

对于一位客户,我已经完成了使用:

Data <- cbind(y.dt[,names(y.dt)[1], with = F], x.dt)
Formula <- formula(paste(paste(names(y.dt)[1], "~"), paste(names(x.dt), collapse="+")))
lm(Formula, data = Data)

但是它返回了一个错误,说明

Error in terms.formula(formula, data = data) :
invalid term in model formula

我的问题是:

  1. 如何解决此错误?

  2. 如何同时为所有客户进行回归?

  3. 谢谢

1 个答案:

答案 0 :(得分:2)

因此,您收到错误的原因是因为y.dt列名称是数字,并且似乎lm不理解它们是列名而不仅仅是从{{1 }}。

很高兴,如果您在formula内不使用data.table

进行此操作,这似乎不是问题

如果您要运行(使用原始列名称)

formula

它会将temp <- y.dt[, list(mylm = lapply(.SD, function(x) lm(x ~ ., data = x.dt)))] 模型中的所有lm模型存储为temp

因此,例如,如果您想要系数,则可以这样做(此输出的每一列都是不同的客户端)

list

哪个与您的单次尝试匹配(我在此更改了temp[, sapply(mylm, coef)] # [,1] [,2] [,3] # (Intercept) -0.38717712 -0.2199147 -0.2108260 # PC1 -0.09782968 0.2076343 -0.2295490 # PC2 -0.20720121 -0.1559755 0.3452985 # PC3 -0.14836259 0.6736415 -0.1785973 的列名,因此不会返回错误)

y.dt