给出以下数据的例子。
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
我的问题是。
我如何解决这个错误?
我怎样才能同时对所有客户进行回归?
谢谢您
所以你得到错误的原因是由于 y.dt
列名是数字,似乎 lm
不理解它们是列名而不仅仅是数字,当从 formula
.
很高兴的是,这似乎不是一个问题,如果你将做的内部一个 data.table
而不使用 formula
如果你要运行(用你原来的列名来运行
temp <- y.dt[, list(mylm = lapply(.SD, function(x) lm(x ~ ., data = x.dt)))]
它将存储你所有的 lm
模型中 temp
作为 list
s.
所以如果你,想要系数,你可以这样做(这个输出的每一列都是不同的客户端)。
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