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

问题描述 投票:0回答:1

给出以下数据的例子。

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. 我怎样才能同时对所有客户进行回归?

谢谢您

r data.table lm
1个回答
2
投票

所以你得到错误的原因是由于 y.dt 列名是数字,似乎 lm 不理解它们是列名而不仅仅是数字,当从 formula.

很高兴的是,这似乎不是一个问题,如果你将做的内部一个 data.table 而不使用 formula

如果你要运行(用你原来的列名来运行

temp <- y.dt[, list(mylm = lapply(.SD, function(x) lm(x ~ .,  data = x.dt)))]

它将存储你所有的 lm 模型中 temp 作为 lists.

所以如果你,想要系数,你可以这样做(这个输出的每一列都是不同的客户端)。

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 所以它不会返回错误)

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

# Call:
# lm(formula = Formula, data = Data)
#
# Coefficients:
# (Intercept)          PC1          PC2          PC3  
#    -0.38718     -0.09783     -0.20720     -0.14836  
© www.soinside.com 2019 - 2024. All rights reserved.