julia - Julia 中每组的线性回归

标签 julia linear-regression group

要在 Julia 中进行线性回归,我们可以使用函数 lm,如下所示:

using DataFrames
using GLM

df = DataFrame(x=[2,3,2,1,3,5,7,4,2],
                      y=[2,3,5,1,5,6,4,2,3])
9×2 DataFrame
 Row │ x      y     
     │ Int64  Int64 
─────┼──────────────
   1 │     2      2
   2 │     3      3
   3 │     2      5
   4 │     1      1
   5 │     3      5
   6 │     5      6
   7 │     7      4
   8 │     4      2
   9 │     2      3

lm(@formula(y~x), df)
StatsModels.TableRegressionModel{LinearModel{GLM.LmResp{Vector{Float64}}, GLM.DensePredChol{Float64, LinearAlgebra.CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}}}, Matrix{Float64}}

y ~ 1 + x

Coefficients:
───────────────────────────────────────────────────────────────────────
                Coef.  Std. Error     t  Pr(>|t|)  Lower 95%  Upper 95%
───────────────────────────────────────────────────────────────────────
(Intercept)  2.14516     1.11203   1.93    0.0951  -0.484383    4.77471
x            0.403226    0.303282  1.33    0.2254  -0.313923    1.12037
───────────────────────────────────────────────────────────────────────

但我想知道如何在 Julia 中对每个组进行线性回归。以下是一些可重现的数据:

df = DataFrame(group = ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A',
                               'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'],
                      x=[2,3,2,1,3,5,7,4,2,3,4,5,2,6,3,1,6,1],
                      y=[2,3,5,1,5,6,4,2,3,3,2,4,7,1,8,4,3,1])
18×3 DataFrame
 Row │ group  x      y     
     │ Char   Int64  Int64 
─────┼─────────────────────
   1 │ A          2      2
   2 │ A          3      3
   3 │ A          2      5
   4 │ A          1      1
   5 │ A          3      5
   6 │ A          5      6
   7 │ A          7      4
   8 │ A          4      2
  ⋮  │   ⋮      ⋮      ⋮
  12 │ B          5      4
  13 │ B          2      7
  14 │ B          6      1
  15 │ B          3      8
  16 │ B          1      4
  17 │ B          6      3
  18 │ B          1      1
             3 rows omitted

所以我想知道是否有人知道如何对每个组执行线性回归(在本例中为 df 中的 A 组和 B 组)并获取统计系数,例如 p 值和 R 平方Julia 中的组?

最佳答案

更新:根据 @matnor 关于用基线解释回归结果的问题的评论,这里有一个更好的公式,可以提供更清晰的分组结果:

lm(@formula(y~0 + group + x & group), df)

通过这种回归,该表基本上是不言自明的。请注意,协方差仍然需要解释(但根据上下文可能更适用)。

原答案: 它可以很简单:

lm(@formula(y~1 + group + x*group), df)

GLM 将group 拟合为分类变量,为每个组添加一个虚拟系数(也许今天 PC 人群会更改此名称)。交互项x*group 添加了另一组虚拟系数。第一组代表每组的截距,第二组代表斜率。结果如下:

StatsModels.TableRegressionModel{...}

y ~ 1 + x + group + x & group

Coefficients:
──────────────────────────────────────────────────────
                  Coef.  Std. Error      t  Pr(>|t|)
──────────────────────────────────────────────────────
(Intercept)    2.14516     1.47762    1.45    0.1686
x              0.403226    0.402988   1.00    0.3340
group: B       2.62322     2.10649    1.25    0.2335
x & group: B  -0.723079    0.557198  -1.30    0.2154
──────────────────────────────────────────────────────

请注意,A 组不会出现,因为它是基线组(并且对应于第一个截距/斜率对)。

如果您查看数字,例如,对于 B 组,您可以看到 2.62322 和 -0.723079,需要将它们添加到基线以获得组的斜率/截距:

julia> # 4.76838, -0.319853 are group B slope/intercept

julia> 2.14516 + 2.62322 ≈ 4.76838 # intercept
true

julia> 0.403226 + -0.723079 ≈ -0.319853 # slope
true

此方法在效率方面有一些好处,并且增加了灵活性(GLM 具有更多功能)。

关于julia - Julia 中每组的线性回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74887169/

相关文章:

r - 计算均值,包括除一个以外的所有因子水平

constructor - 在 Julia 中为数学常数供电很慢

dataframe - 对 Julia DataFrame 中的行求和

optimization - 在 Julia 中使用导入的 Scipy 函数时出现语法错误

python - 为 python 中的每个预测变量调整 R 平方

python - 如何找到对数线性回归的方差分析?

python - 不同的Python最小化函数给出不同的值,为什么?

arrays - 如何在 MongoDB 聚合中合并来自多个文档的数组而不重复?