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

从R中的单个数据帧运行多个线性回归,r,matrix,time-series,linear-regression,R,Matrix,Time Series,Linear Regression,我有一个单一国家的出口贸易数据集,共有21列。第一列显示年份(1962-2014年),而其他20列为贸易伙伴。我试图对“年份”列和“彼此”列进行线性回归。我已经尝试了这里推荐的方法:这需要使用 combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE) 然而,这只会产生每一对的截距,这对我来说不如回归的斜率重要 此外,我还尝试将我的数据集用作时间序列,但是当我尝试运行 lm(dimnames~., brazilts, na.a

我有一个单一国家的出口贸易数据集,共有21列。第一列显示年份(1962-2014年),而其他20列为贸易伙伴。我试图对“年份”列和“彼此”列进行线性回归。我已经尝试了这里推荐的方法:这需要使用

combn(names(DF), 2, function(x){lm(DF[, x])}, simplify = FALSE)
然而,这只会产生每一对的截距,这对我来说不如回归的斜率重要

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

lm(dimnames~., brazilts, na.action=na.exclude)
(其中,
brazilts
是我的数据集,作为从“1962”到“2014”的时间序列),它返回:

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个国家每年按国家对划分的更大的总出口数据集的take回归。也许我的攻击方式完全错误,所以欢迎任何帮助或批评。请记住,年份(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  

除了统计上的理由外,编程问题是一个有趣的问题。这里有一个解决方案,但可能不是最优雅的。首先,创建一个示例数据集:

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
groupby
在所有子集中执行回归<代码>扫帚::整洁将回归输出放入一个漂亮的数据框中。有关更多信息,请参阅扫帚

如果需要保留模型以进行某种调整(针对
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$mod
可以为您提供它们的列表,这样就很容易传递到,例如
lappy

,只需添加一个替代方法,我建议采用以下方法:

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
groupby
在所有子集中执行回归<代码>扫帚::整洁将回归输出放入一个漂亮的数据框中。有关更多信息,请参阅扫帚

如果需要保留模型以进行某种调整(针对
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$mod
提供了它们的列表,这使得传递到例如
lappy

非常容易。放置样本数据集和预期输出对帮助更为有用。如果需要帮助,您需要提供某种帮助。我们需要了解您到底尝试了什么,以及您尝试向这些函数馈送了哪些对象。如果我们看不到你的代码,我们就无法帮助你处理你的代码。抱歉@MrFlick,我对编码一无所知,不知道如何正确提问,但这完全有道理。幸运的是,科芬朱基在下面给了我一个可行的答案。谢谢你的帮助!假设样本数据集和预期输出更有助于提供帮助。如果需要帮助,您需要提供某种帮助。我们需要了解您到底尝试了什么,以及您尝试向这些函数馈送了哪些对象。如果我们看不到你的代码,我们就无法帮助你处理你的代码。抱歉@MrFlick,我对编码一无所知,不知道如何正确提问,但这完全有道理。幸运的是,科芬朱基在下面给了我一个可行的答案。谢谢你的帮助!就像一个小评论:如果你添加
reg,就像一个小评论:如果你添加
reg,这是非常有用的,似乎是我要走的路。我每年都在处理国家对,所以我使用了
df%>%groupby(国家原产地id,国家目的地id)%>%do(tidy(lm(年份~调整后的出口值,数据=))
,将其分解为每个国家对的回归。这种方法唯一的问题是,它只返回十行,表示五个国家对的回归(一行表示截距,一行表示每个国家对的斜率)。我怎么能看到它刚才做的所有回归呢?我肯定布鲁姆有这个东西,但我找不到。非常感谢你!没关系,我只是不知道如何单独查看对象。我明白了。你帮了我大忙,谢谢!我已经花了太长时间在这上面了,真希望我能早点看到扫帚包。干杯。这是非常有用的,似乎是我要走的路。我每年都在处理国家对,所以我使用了
df%>%groupby(国家原产地id,国家目的地id)%>%do(tidy(lm(年份~调整后的出口值,数据=))
,将其分解为每个国家对的回归。我的唯一