使用 data.table 的多元线性回归模型和使用 grep 的模式
Multiple linear regression models using data.table and patterns with grep
我正在尝试使用单个 data.table 到 运行 多元线性回归模型,使用模式 grep()
并将该模型应用于 table 的每个部分使用 by=
这是我目前得到的。
d <- data.table(label=rep(c('a','b','c'),
c(10,10,10)),resp1=rnorm(30),resp2=rnorm(30),x1=runif(30),x2=runif(30))
for (i in grep('resp',names(d),value = TRUE)) {
models[i] <- d[,as.list(coef(lm(i ~ x1 + x2 ))),by=label]}
然后我得到以下错误:
Error in model.frame.default(formula = eval(i) ~ x1 + x2,
drop.unused.levels = TRUE) : variable lengths differ (found for
'x1')
我确定我遗漏了一些非常明显的东西。我可以看到 by
参数在使用循环时不起作用?
您应该进行以下更改以使其在 data.table
中运行。您设置的问题是 i
在 for 循环中被转换为 "resp1"
(带引号的 resp1),这对于公式来说是不可取的,在 data.table 的情况下也是如此
lm
尝试在提供的公式环境中使用的变量,因为 lm 参数中没有 "data" 元素,R 无法确定这些变量来自哪个 place/environment 因此,你需要提供.SD(data.table中的数据子集),这可以在data.table中的第二个表达式元素中找到(我们通常将其称为j表达式)因此你必须使用$
或 [[
在这里明确。
假设 "d" 是你的 data.table 然后这样做:
models <- list() ###Initialize the list where you want to save your outcome.
for (i in grep('resp',names(d),value = TRUE)) {
models[[i]] <- d[,as.list(coef(lm(.SD[[i]] ~ .SD$x1 + .SD$x2 ))),by=label]
}
要调用它们的值,您需要这样做:
models[["resp1"]] and/or models[["resp2"]]
输出:
# label (Intercept) x1 x2
# 1: a 1.0189543 -1.3744124 -1.8500784
# 2: b -1.7325901 0.6330311 0.7848932
# 3: c 0.3497773 -0.9138042 0.7833840
# > models[["resp2"]]
# label (Intercept) x1 x2
# 1: a -0.89177938 1.1053718 0.8886103
# 2: b -0.45480510 -0.5146982 1.5587663
# 3: c -0.04379456 -0.9792022 0.8691384
我正在尝试使用单个 data.table 到 运行 多元线性回归模型,使用模式 grep()
并将该模型应用于 table 的每个部分使用 by=
这是我目前得到的。
d <- data.table(label=rep(c('a','b','c'),
c(10,10,10)),resp1=rnorm(30),resp2=rnorm(30),x1=runif(30),x2=runif(30))
for (i in grep('resp',names(d),value = TRUE)) {
models[i] <- d[,as.list(coef(lm(i ~ x1 + x2 ))),by=label]}
然后我得到以下错误:
Error in model.frame.default(formula = eval(i) ~ x1 + x2, drop.unused.levels = TRUE) : variable lengths differ (found for 'x1')
我确定我遗漏了一些非常明显的东西。我可以看到 by
参数在使用循环时不起作用?
您应该进行以下更改以使其在 data.table
中运行。您设置的问题是 i
在 for 循环中被转换为 "resp1"
(带引号的 resp1),这对于公式来说是不可取的,在 data.table 的情况下也是如此
lm
尝试在提供的公式环境中使用的变量,因为 lm 参数中没有 "data" 元素,R 无法确定这些变量来自哪个 place/environment 因此,你需要提供.SD(data.table中的数据子集),这可以在data.table中的第二个表达式元素中找到(我们通常将其称为j表达式)因此你必须使用$
或 [[
在这里明确。
假设 "d" 是你的 data.table 然后这样做:
models <- list() ###Initialize the list where you want to save your outcome.
for (i in grep('resp',names(d),value = TRUE)) {
models[[i]] <- d[,as.list(coef(lm(.SD[[i]] ~ .SD$x1 + .SD$x2 ))),by=label]
}
要调用它们的值,您需要这样做:
models[["resp1"]] and/or models[["resp2"]]
输出:
# label (Intercept) x1 x2
# 1: a 1.0189543 -1.3744124 -1.8500784
# 2: b -1.7325901 0.6330311 0.7848932
# 3: c 0.3497773 -0.9138042 0.7833840
# > models[["resp2"]]
# label (Intercept) x1 x2
# 1: a -0.89177938 1.1053718 0.8886103
# 2: b -0.45480510 -0.5146982 1.5587663
# 3: c -0.04379456 -0.9792022 0.8691384