簡體   English   中英

從R中的單個數據幀運行多個線性回歸

[英]Running several linear regressions from a single dataframe in R

我有一個包含21列的單個國家/地區的出口貿易數據的數據集。 第一列表示年份(1962-2014年),而其他20個是貿易伙伴。 我正在嘗試對Years列和其他各列進行線性回歸。 我嘗試了這里推薦的方法: 從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

這是繼續使用系數的非常方便的形式。 所需dplyr的只是熔化數據框,使所有列都是數據集中的行,然后使用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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM