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)实际上是我的解释变量,而总出口值是我的因变量,这可能会影响我在上述示例中的语法。提前致谢!
只是为了添加一个替代方案,我建议沿着这条路线走下去:
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。