从 R 中的单个数据帧运行多个线性回归

its*_*boi 0 r time-series matrix linear-regression

我有一个包含 21 列的单个国家的出口贸易数据集。第一列表示年份 (1962-2014),而其他 20 列是贸易伙伴。我正在尝试对年份列和其他列运行线性回归。我已经尝试过这里推荐的方法:从 R中的数据帧运行多个简单的线性回归,需要使用

combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE)
Run Code Online (Sandbox Code Playgroud)

然而,这只会产生每一对的截距,这对我来说不如回归的斜率重要。

此外,我尝试将我的数据集用作时间序列,但是当我尝试运行时

lm(dimnames~., brazilts, na.action=na.exclude)
Run Code Online (Sandbox Code Playgroud)

brazilts我的数据集作为从“1962”到“2014”的时间序列在哪里)它返回:

Error in model.frame.default(formula = dimnames ~ ., data = brazilts,  : 
  object is not a matrix.
Run Code Online (Sandbox Code Playgroud)

因此,我用矩阵尝试了相同的方法,但它返回了错误:

Error in model.frame.default(formula = . ~ YEAR, data = brazilmatrix,  : 
  'data' must be a data.frame, not a matrix or an array
Run Code Online (Sandbox Code Playgroud)

brazilmatrix我的数据集在哪里,data.matrix其中包含多年的列)。

真的,我什至不精通 R,在这一点上。最终目标是创建一个循环,我可以使用它来对 28 个国家/地区每年按国家/地区对的明显更大的总出口数据集进行回归。也许我以完全错误的方式攻击这一点,所以欢迎任何帮助或批评。请记住,年份(1962-2014)实际上是我的解释变量,而总出口值是我的因变量,这可能会影响我在上述示例中的语法。提前致谢!

cof*_*nky 5

只是为了添加一个替代方案,我建议沿着这条路线走下去:

library(reshape2)
library(dplyr)
library(broom)

df <- melt(data.frame(x = 1962:2014, 
                      y1 = rnorm(53), 
                      y2 = rnorm(53), 
                      y3 = rnorm(53)), 
          id.vars = "x")

df %>% group_by(variable) %>% do(tidy(lm(value ~ x, data=.)))
Run Code Online (Sandbox Code Playgroud)

在这里,我只是融合了数据,以便所有相关列都由行组给出,以便能够使用dplyr的分组操作。这给出了以下数据帧作为输出:

Source: local data frame [6 x 6]
Groups: variable [3]

  variable        term     estimate    std.error  statistic   p.value
    (fctr)       (chr)        (dbl)        (dbl)      (dbl)     (dbl)
1       y1 (Intercept) -3.646666114 18.988154862 -0.1920495 0.8484661
2       y1           x  0.001891627  0.009551103  0.1980533 0.8437907
3       y2 (Intercept) -8.939784046 16.206935047 -0.5516024 0.5836297
4       y2           x  0.004545156  0.008152140  0.5575415 0.5795966
5       y3 (Intercept) 21.699503502 16.785586452  1.2927462 0.2019249
6       y3           x -0.010879271  0.008443204 -1.2885240 0.2033785
Run Code Online (Sandbox Code Playgroud)

这是一种非常方便的形式,可以继续使用系数。所需要做的就是融合数据框,使所有列都是数据集中的行,然后使用dplyr'sgroup_by在所有子集中执行回归。broom::tidy将回归输出放入一个不错的数据框中。有关?broom更多信息,请参阅。

如果您需要保留模型以进行某种调整(为lm对象实现),那么您还可以执行以下操作:

df %>% group_by(variable) %>% do(mod = lm(value ~ x, data=.))

Source: local data frame [3 x 2]
Groups: <by row>

# A tibble: 3 x 2
  variable      mod
*   <fctr>   <list>
1       y1 <S3: lm>
2       y2 <S3: lm>
3       y3 <S3: lm>
Run Code Online (Sandbox Code Playgroud)

在这里,对于每个变量,lm对象都存储在数据帧中。因此,如果您想获得第一个模型输出,您可以像访问任何普通数据框一样访问它,例如

tmp <- df %>% group_by(variable) %>% do(mod = lm(value ~ x, data=.))
tmp[tmp$variable == "y1",]$mod
[[1]]

Call:
lm(formula = value ~ x, data = .)

Coefficients:
(Intercept)            x  
  -1.807255     0.001019  
Run Code Online (Sandbox Code Playgroud)

如果您想将某些方法应用于所有lm对象,这很方便,因为您可以使用tmp$mod为您提供它们列表的事实,这使得传递给 eg 变得容易lapply