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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从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”的时间序列)它返回:

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)实际上是我的解释变量,总出口的价值是我的因变量,这可能会在上面的例子中抛弃我的语法。提前致谢!

答案

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

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

这是继续使用系数的一种非常方便的形式。所需要的只是融化数据框,使所有列都是数据集中的行,然后使用dplyrgroup_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

另一答案

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

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  

以上是关于从R中的单个数据帧运行几个线性回归的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 中另一个变量的线性回归的斜率来估算单个变量的缺失数据

pyspark使用数据帧运行线性回归

矩阵中的火花循环以运行线性回归

从线性回归中提取 p 值和 r 平方

多元线性回归 - R 中的梯度下降

R语言广义线性模型函数GLMglm函数构建逻辑回归模型(Logistic regression)构建仿真数据集控制所有其它预测变量进而评估单个预测因子对结果概率的影响