我正在使用来自MASS
包的波士顿数据集。
我需要分别使用其他13个预测变量来预测crim
,并保存每个模型的斜率系数。
我如何自动化?
我不知道如何在for
循环中访问数据集的变量。
我尝试过使用索引访问单个变量:
fit1 = lm(Boston[1]~Boston[2])
但它返回了这个:
Error en model.frame.default(formula = Boston[1] ~ Boston[2], drop.unused.levels = TRUE) :
invalid type (list) for variable 'Boston[1]'
我希望能够访问各个变量,以便使用for
循环执行13个不同的lm()
s:fit = Boston[i] ~ Boston[i+1]
答案 0 :(得分:5)
reformulate()
是使用指定预测变量设置公式的便捷方式:
library("MASS")
get.slope <- function(pred) {
fit <- lm(reformulate(pred,response="crim"),data=Boston)
## unname() to avoid duplicating name of response
return(unname(coef(fit)[2]))
}
sapply(names(Boston)[-1],get.slope)
## zn indus chas nox rm age
## -0.07393498 0.50977633 -1.89277655 31.24853120 -2.68405122 0.10778623
## dis rad tax ptratio black lstat
## -1.55090168 0.61791093 0.02974225 1.15198279 -0.03627964 0.54880478
## medv
## -0.36315992
答案 1 :(得分:2)
lm(crim ~ zn, data = Boston)
或
lm(Boston$crim ~ Boston$zn)
使用
names(Boston)
找出Boston
如果你真的想按索引获取列,获取第1列的所有行的语法是
Boston[,1]
答案 2 :(得分:1)
您也可以使用lapply
fits <- lapply(predictors, function(i) {temp <- lm(crim~get(i), data=Boston)$coefficients
names(temp)[2]<- i
return(temp)})
fits
[[1]]
(Intercept) zn
4.45369376 -0.07393498
[[2]]
(Intercept) indus
-2.0637426 0.5097763
.... and so on....
如果您只想要矢量或斜率系数,请尝试:
> setNames(sapply(fits, "[[", 2), predictors)
zn indus chas nox rm age dis rad
-0.07393498 0.50977633 -1.89277655 31.24853120 -2.68405122 0.10778623 -1.55090168 0.61791093
tax ptratio black lstat medv
0.02974225 1.15198279 -0.03627964 0.54880478 -0.36315992