在R

时间:2016-12-20 11:56:36

标签: r loops linear-regression

我有一个数据库,我想做几个回归。他们都看起来像这样:

fit <- lm(Variable1 ~ Age + Speed + Gender + Mass, data=Data)

唯一变量变量是variable1。现在我想循环或使用apply系列中的一些东西在variable1的地方循环几个变量。这些变量是我的数据文件中的列。有人可以帮我解决这个问题吗?非常感谢!

到目前为止我尝试了什么:

当我使用names()函数提取其中一个列名时,我得到一个列的名称:

varname  = as.name(names(Data[14])) 

但是当我填写(我使用attach()函数)时:

fit <- lm(Varname ~ Age + Speed + Gender + Mass, data=Data) 

我收到以下错误:

  

model.frame.default中的错误(公式= Varname~年龄+速度+性别   +:object不是矩阵

我认为lm()函数不能将Varname识别为Variable1。

2 个答案:

答案 0 :(得分:4)

您的案例中的问题是lm函数中的公式会尝试读取data中列的文字名称,或者将整个向量输入回归。因此,要使用列名,您需要告诉公式解释变量varnames的值并将其与其他变量合并。

# generate some data
set.seed(123)
Data <- data.frame(x = rnorm(30), y = rnorm(30), 
    Age = sample(0:90, 30), Speed = rnorm(30, 60, 10), 
    Gender = sample(c("W", "M"), 30, rep=T), Mass = rnorm(30))
varnames <- names(Data)[1:2]

# fit regressions for multiple dependent variables 
fit <- lapply(varnames, 
    FUN=function(x) lm(formula(paste(x, "~Age+Speed+Gender+Mass")), data=Data))
names(fit) <- varnames

 fit
$x

Call:
lm(formula = formula(paste(x, "~Age+Speed+Gender+Mass")), data = Data)

Coefficients:
(Intercept)          Age        Speed      GenderW         Mass  
   0.135423     0.010013    -0.010413     0.023480     0.006939  


$y

Call:
lm(formula = formula(paste(x, "~Age+Speed+Gender+Mass")), data = Data)

Coefficients:
(Intercept)          Age        Speed      GenderW         Mass  
   2.232269    -0.008035    -0.027147    -0.044456    -0.023895  

答案 1 :(得分:3)

您可以使用lapply循环变量。

fit <- lapply(Data[,c(...)], function(x) lm(x ~ Age + Speed + Gender + Mass, data = Data))

这会为您提供结果列表。

c(...)应该包含您的变量名称作为字符串。或者,您可以按Data中的位置选择变量,例如Data[,1:5]