要在 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/