运行 R 中单个数据帧的多个线性回归
Running several linear regressions from a single dataframe in R
我有一个包含 21 列的单个国家/地区的出口贸易数据数据集。第一列表示年份 (1962-2014),而其他 20 列是贸易伙伴。我正在尝试 运行 年列和其他列的线性回归。我已经尝试了这里推荐的方法:Running multiple, simple linear regressions from dataframe in R 需要使用
combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE)
然而,这只会产生每对的截距,这对我来说不如回归的斜率重要。
此外,我尝试将我的数据集用作时间序列,但是当我尝试 运行
lm(dimnames~., brazilts, na.action=na.exclude)
(其中 brazilts
是我的数据集,作为从“1962”到“2014”的时间序列)它 returns:
Error in model.frame.default(formula = dimnames ~ ., data = brazilts, :
object is not a matrix.
因此,我对矩阵尝试了相同的方法,但随后返回了错误:
Error in model.frame.default(formula = . ~ YEAR, data = brazilmatrix, :
'data' must be a data.frame, not a matrix or an array
(其中 brazilmatrix
是我的数据集 data.matrix
,其中包含一个年份列)。
真的,我什至不精通 R,在这一点上。最终目标是创建一个循环,我可以使用该循环对 28 个国家每年按国家对划分的更大的总出口数据集进行回归。也许我以完全错误的方式攻击它,所以欢迎任何帮助或批评。请记住,年份 (1962-2014) 实际上是我的解释变量,总出口值是我的因变量,这可能会破坏我在上面示例中的语法。提前致谢!
撇开这样做的统计理由不谈,编程问题是一个有趣的问题。这是一个解决方案,但可能不是最优雅的解决方案。首先,创建样本数据集:
x = c(1962:2014)
y1 = c(rnorm(53))
y2 = c(rnorm(53))
y3 = c(rnorm(53))
mydata = data.frame(x, y1, y2, y3)
attach(mydata)
head(mydata)
# x y1 y2 y3
#1 1962 -0.9884054 -1.68208217 0.5980446
#2 1963 -1.0741098 0.51309753 1.0986366
#3 1964 0.1357549 -0.23427820 0.1482258
#4 1965 -0.8846920 -0.60375400 0.7162992
#5 1966 -0.5529187 0.85573739 0.5541827
#6 1967 0.4881922 -0.09360152 -0.5379037
接下来,使用for
循环做几个回归:
for(i in 2:4){
reg = lm(x ~ mydata[,i])
print(reg)
}
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1988.0088 -0.1341
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1987.87 2.07
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1987.304 -4.101
只是为了添加一个替代方案,我建议沿着这条路线走:
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=.)))
在这里,我只是融合了数据,以便所有相关的列都由行组给出,以便能够使用 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
这是继续使用系数的一种非常方便的形式。所需要做的就是融化数据框,使所有列都是数据集中的行,然后使用 dplyr
的 group_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>
此处,对于每个变量,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
如果您想将某些方法应用于所有 lm
对象,这很方便,因为您可以使用 tmp$mod
为您提供它们的列表这一事实,这使得传递给例如对象变得容易。 lapply
.
我有一个包含 21 列的单个国家/地区的出口贸易数据数据集。第一列表示年份 (1962-2014),而其他 20 列是贸易伙伴。我正在尝试 运行 年列和其他列的线性回归。我已经尝试了这里推荐的方法:Running multiple, simple linear regressions from dataframe in R 需要使用
combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE)
然而,这只会产生每对的截距,这对我来说不如回归的斜率重要。
此外,我尝试将我的数据集用作时间序列,但是当我尝试 运行
lm(dimnames~., brazilts, na.action=na.exclude)
(其中 brazilts
是我的数据集,作为从“1962”到“2014”的时间序列)它 returns:
Error in model.frame.default(formula = dimnames ~ ., data = brazilts, :
object is not a matrix.
因此,我对矩阵尝试了相同的方法,但随后返回了错误:
Error in model.frame.default(formula = . ~ YEAR, data = brazilmatrix, :
'data' must be a data.frame, not a matrix or an array
(其中 brazilmatrix
是我的数据集 data.matrix
,其中包含一个年份列)。
真的,我什至不精通 R,在这一点上。最终目标是创建一个循环,我可以使用该循环对 28 个国家每年按国家对划分的更大的总出口数据集进行回归。也许我以完全错误的方式攻击它,所以欢迎任何帮助或批评。请记住,年份 (1962-2014) 实际上是我的解释变量,总出口值是我的因变量,这可能会破坏我在上面示例中的语法。提前致谢!
撇开这样做的统计理由不谈,编程问题是一个有趣的问题。这是一个解决方案,但可能不是最优雅的解决方案。首先,创建样本数据集:
x = c(1962:2014)
y1 = c(rnorm(53))
y2 = c(rnorm(53))
y3 = c(rnorm(53))
mydata = data.frame(x, y1, y2, y3)
attach(mydata)
head(mydata)
# x y1 y2 y3
#1 1962 -0.9884054 -1.68208217 0.5980446
#2 1963 -1.0741098 0.51309753 1.0986366
#3 1964 0.1357549 -0.23427820 0.1482258
#4 1965 -0.8846920 -0.60375400 0.7162992
#5 1966 -0.5529187 0.85573739 0.5541827
#6 1967 0.4881922 -0.09360152 -0.5379037
接下来,使用for
循环做几个回归:
for(i in 2:4){
reg = lm(x ~ mydata[,i])
print(reg)
}
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1988.0088 -0.1341
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1987.87 2.07
Call:
lm(formula = x ~ mydata[, i])
Coefficients:
(Intercept) mydata[, i]
1987.304 -4.101
只是为了添加一个替代方案,我建议沿着这条路线走:
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=.)))
在这里,我只是融合了数据,以便所有相关的列都由行组给出,以便能够使用 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
这是继续使用系数的一种非常方便的形式。所需要做的就是融化数据框,使所有列都是数据集中的行,然后使用 dplyr
的 group_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>
此处,对于每个变量,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
如果您想将某些方法应用于所有 lm
对象,这很方便,因为您可以使用 tmp$mod
为您提供它们的列表这一事实,这使得传递给例如对象变得容易。 lapply
.