如果我的线性回归数据包含几个混合的线性关系怎么办?

机器算法验证 回归 线性模型 数据集
2022-01-24 20:33:43

假设我正在研究水仙花对各种土壤条件的反应。我收集了关于土壤 pH 值与水仙花成熟高度的数据。我期待一个线性关系,所以我开始运行线性回归。

然而,当我开始研究时,我并没有意识到人口中实际上包含两种水仙花,每种水仙花对土壤 pH 值的反应都非常不同。所以该图包含两个不同的线性关系:

土壤 pH 值与花高 (cm)

当然,我可以观察它并手动将其分开。但我想知道是否有更严格的方法。

问题:

  1. 是否有统计测试来确定数据集是否更适合单行或 N 行?

  2. 我将如何运行线性回归来拟合 N 条线?换句话说,我如何解开混合混合的数据?

我可以想到一些组合方法,但它们的计算成本似乎很高。


说明:

  1. 在收集数据时,尚不清楚是否存在两个品种。每个水仙花的品种没有被观察,没有被记录,也没有被记录。

  2. 无法恢复此信息。自收集数据以来,水仙花已经死亡。

我的印象是这个问题类似于应用聚类算法,因为你几乎需要在开始之前知道聚类的数量。我相信对于任何数据集,增加行数都会减少总 rms 误差。在极端情况下,您可以将数据集划分为任意对,并在每对之间简单地画一条线。(例如,如果您有 1000 个数据点,您可以将它们分成 500 个任意对并在每对之间画一条线。)拟合将是精确的,rms 误差将完全为零。但这不是我们想要的。我们想要“正确”的行数。

4个回答

如果我们假设您拥有不同品种的标签,我认为 Demetri 的答案是一个很好的答案。当我阅读您的问题时,对我来说似乎并非如此。我们可以使用基于 EM 算法的方法来基本拟合 Demetri 建议的模型,但不知道品种的标签。幸运的是,R 中的 mixtools 包为我们提供了这个功能。由于您的数据是完全分离的,而且您似乎有相当多的数据,因此应该相当成功。

library(mixtools)

# Generate some fake data that looks kind of like yours
n1 <- 150
ph1 = runif(n1, 5.1, 7.8)
y1 <- 41.55 + 5.185*ph1 + rnorm(n1, 0, .25)

n2 <- 150
ph2 <- runif(n2, 5.3, 8)
y2 <- 65.14 + 1.48148*ph2 + rnorm(n2, 0, 0.25)

# There are definitely better ways to do all of this but oh well
dat <- data.frame(ph = c(ph1, ph2), 
                  y = c(y1, y2), 
                  group = rep(c(1,2), times = c(n1, n2)))

# Looks about right
plot(dat$ph, dat$y)

# Fit the regression. One line for each component. This defaults
# to assuming there are two underlying groups/components in the data
out <- regmixEM(y = dat$y, x = dat$ph, addintercept = T)

我们可以检查结果

> summary(out)
summary of regmixEM object:
          comp 1    comp 2
lambda  0.497393  0.502607
sigma   0.248649  0.231388
beta1  64.655578 41.514342
beta2   1.557906  5.190076
loglik at estimate:  -182.4186 

所以它适合两个回归,它估计 49.7% 的观察结果落入组件 1 的回归中,50.2% 落入组件 2 的回归中。我模拟数据的方式是 50-50 拆分,所以这很好。

我用于模拟的“真实”值应该给出以下几行:

y = 41.55 + 5.185*ph 和 y = 65.14 + 1.48148*ph

(我从您的图中“手动”估计,以便我创建的数据看起来与您的相似)以及 EM 算法在这种情况下给出的行是:

y = 41.514 + 5.19*ph 和 y = 64.655 + 1.55*ph

非常接近实际值。

我们可以将拟合线与数据一起绘制

plot(dat$ph, dat$y, xlab = "Soil Ph", ylab = "Flower Height (cm)")
abline(out$beta[,1], col = "blue") # plot the first fitted line
abline(out$beta[,2], col = "red") # plot the second fitted line

通过 EM 拟合线

编辑:我最初认为 OP 知道哪些观察来自哪个物种。OP的编辑清楚地表明我原来的方法是不可行的。我会把它留给后代,但另一个答案要好得多。作为安慰,我在 Stan 中编写了一个混合模型。我并不是说贝叶斯方法在这种情况下特别好,但它只是我可以贡献的一些巧妙的东西。

斯坦代码

data{

  //Number of data points
  int N; 

  real y[N];
  real x[N];
}
parameters{
  //mixing parameter
  real<lower=0, upper =1>  theta;

  //Regression intercepts
  real beta_0[2];

  //Regression slopes.
  ordered[2] beta_1;

  //Regression noise
  real<lower=0> sigma[2];
}
model{

  //priors
  theta ~ beta(5,5);
  beta_0 ~ normal(0,1);
  beta_1 ~ normal(0,1);
  sigma ~ cauchy(0,2.5);

  //mixture likelihood
  for (n in 1:N){
    target+=log_mix(theta,
                     normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
                     normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));
  }
}
generated quantities {
  //posterior predictive distribution
  //will allow us to see what points belong are assigned
  //to which mixture 
  matrix[N,2] p;
  matrix[N,2] ps;
  for (n in 1:N){
    p[n,1] = log_mix(theta,
                     normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
                     normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));

    p[n,2]= log_mix(1-theta,
                     normal_lpdf(y[n] | beta_0[1] + beta_1[1]*x[n], sigma[1]),
                     normal_lpdf(y[n] | beta_0[2] + beta_1[2]*x[n], sigma[2]));

    ps[n,]= p[n,]/sum(p[n,]);
  }
}

从 R 运行 Stan 模型

library(tidyverse)
library(rstan)


#Simulate the data
N = 100
x = rnorm(N, 0, 3)
group = factor(sample(c('a','b'),size = N, replace = T))

y = model.matrix(~x*group)%*% c(0,1,0,2) 
y = as.numeric(y) + rnorm(N)

d = data_frame(x = x, y = y)

d %>% 
  ggplot(aes(x,y))+
  geom_point()

#Fit the model
N = length(x)
x = as.numeric(x)
y = y

fit = stan('mixmodel.stan', 
           data = list(N= N, x = x, y = y),
           chains = 8,
           iter = 4000)

结果

在此处输入图像描述

虚线是基本事实,实线是估计的。


原始答案

如果您知道哪个样品来自哪个品种的水仙花,您可以估计品种和土壤 PH 之间的相互作用。

你的模型看起来像

y=β0+β1variety+β2PH+β3varietyPH

这是 R 中的一个示例。我生成了一些如下所示的数据:

在此处输入图像描述

显然是两条不同的线,而且这些线对应于两个物种。以下是如何使用线性回归估计线条。

library(tidyverse)

#Simulate the data
N = 1000
ph = runif(N,5,8)
species = rbinom(N,1,0.5)

y = model.matrix(~ph*species)%*% c(20,1,20,-3) + rnorm(N, 0, 0.5)
y = as.numeric(y)

d = data_frame(ph = ph, species = species, y = y)

#Estimate the model
model = lm(y~species*ph, data = d)
summary(model)

结果是

> summary(model)

Call:
lm(formula = y ~ species * ph, data = d)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.61884 -0.31976 -0.00226  0.33521  1.46428 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 19.85850    0.17484  113.58   <2e-16 ***
species     20.31363    0.24626   82.49   <2e-16 ***
ph           1.01599    0.02671   38.04   <2e-16 ***
species:ph  -3.03174    0.03756  -80.72   <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4997 on 996 degrees of freedom
Multiple R-squared:  0.8844,    Adjusted R-squared:  0.8841 
F-statistic:  2541 on 3 and 996 DF,  p-value: < 2.2e-16

对于标记为 0 的物种,这条线大约是

y=19+1PH

对于标记为 1 的物种,这条线大约是

y=402PH

统计方法与上述两个答案非常相似,但如果您缺乏先验知识,它更多地涉及如何选择潜在类别的数量。您可以使用信息标准或简约性作为选择潜在类别数量的指南。

这是一个使用具有 2-4 个潜在类/组件的有限混合模型 (FMM) 序列的 Stata 示例。第一个表是潜在类成员的系数。这些有点难以解释,但稍后可以使用 将它们转换为概率estat lcprob对于每个类别,您还可以获得一个截距和一个 ph 斜率参数,然后是潜在类别边际概率和两个样本内 IC。这些系数估计值被解释为线性回归模型中的系数。这里最小的样本内BIC 告诉您选择两个组件模型作为最佳模型。AIC 奇怪地选择了 3 组件模型。您还可以使用样本外IC 来挑选或使用交叉验证。

另一种衡量您是否将数据推得太远的方法是最后一个类份额是否非常小,因为额外的组件可能只是反映数据中异常值的存在。在这种情况下,简约有利于简化模型并删除组件。但是,如果您认为在您的环境中可以进行小班教学,那么这可能不是煤矿中的金丝雀。这里简约有利于 2 分量模型,因为第三类仅包含观察值。.01433133004

如果类不那么明显,FMM 方法在实践中并不总是能很好地工作。你可能会遇到太多潜在类的计算困难,特别是如果你没有足够的数据,或者似然函数有多个局部最大值。

. clear

. /* Fake Data */
. set seed 10011979

. set obs 300
number of observations (_N) was 0, now 300

. gen     ph = runiform(5.1, 7.8) in 1/150
(150 missing values generated)

. replace ph = runiform(5.3, 8)   in 151/300
(150 real changes made)

. gen y      = 41.55 + 5.185*ph   + rnormal(0, .25)  in 1/150
(150 missing values generated)

. replace y  = 65.14 + 1.48148*ph + rnormal(0, 0.25) in 151/300
(150 real changes made)

. 
. /* 2 Component FMM */
. fmm 2, nolog: regress y ph

Finite mixture model                            Number of obs     =        300
Log likelihood =  -194.5215

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
1.Class      |  (base outcome)
-------------+----------------------------------------------------------------
2.Class      |
       _cons |   .0034359   .1220066     0.03   0.978    -.2356927    .2425645
------------------------------------------------------------------------------

Class          : 1
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   5.173137   .0251922   205.35   0.000     5.123761    5.222513
       _cons |     41.654   .1622011   256.80   0.000      41.3361    41.97191
-------------+----------------------------------------------------------------
     var(e.y)|   .0619599   .0076322                      .0486698     .078879
------------------------------------------------------------------------------

Class          : 2
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.486062    .026488    56.10   0.000     1.434147    1.537978
       _cons |   65.10664   .1789922   363.74   0.000     64.75582    65.45746
-------------+----------------------------------------------------------------
     var(e.y)|   .0630583   .0075271                      .0499042    .0796797
------------------------------------------------------------------------------

. estat lcprob

Latent class marginal probabilities             Number of obs     =        300

--------------------------------------------------------------
             |            Delta-method
             |     Margin   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
       Class |
          1  |    .499141   .0305016      .4396545    .5586519
          2  |    .500859   .0305016      .4413481    .5603455
--------------------------------------------------------------

. estat ic

Akaike's information criterion and Bayesian information criterion

-----------------------------------------------------------------------------
       Model |        Obs  ll(null)  ll(model)      df         AIC        BIC
-------------+---------------------------------------------------------------
           . |        300         .  -194.5215       7     403.043   428.9695
-----------------------------------------------------------------------------
               Note: N=Obs used in calculating BIC; see [R] BIC note.

. 
. /* 3 Component FMM */
. fmm 3, nolog: regress y ph

Finite mixture model                            Number of obs     =        300
Log likelihood =  -187.4824

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
1.Class      |  (base outcome)
-------------+----------------------------------------------------------------
2.Class      |
       _cons |  -.0312504    .123099    -0.25   0.800    -.2725199    .2100192
-------------+----------------------------------------------------------------
3.Class      |
       _cons |  -3.553227   .5246159    -6.77   0.000    -4.581456   -2.524999
------------------------------------------------------------------------------

Class          : 1
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   5.173077   .0252246   205.08   0.000     5.123637    5.222516
       _cons |   41.65412     .16241   256.48   0.000      41.3358    41.97243
-------------+----------------------------------------------------------------
     var(e.y)|   .0621157   .0076595                      .0487797    .0790975
------------------------------------------------------------------------------

Class          : 2
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.476049   .0257958    57.22   0.000      1.42549    1.526608
       _cons |   65.18698   .1745018   373.56   0.000     64.84496    65.52899
-------------+----------------------------------------------------------------
     var(e.y)|   .0578413   .0070774                      .0455078    .0735173
------------------------------------------------------------------------------

Class          : 3
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.776746   .0020074   885.09   0.000     1.772811     1.78068
       _cons |   62.76633   .0134072  4681.54   0.000     62.74005    62.79261
-------------+----------------------------------------------------------------
     var(e.y)|   9.36e-06   6.85e-06                      2.23e-06    .0000392
------------------------------------------------------------------------------

. estat lcprob

Latent class marginal probabilities             Number of obs     =        300

--------------------------------------------------------------
             |            Delta-method
             |     Margin   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
       Class |
          1  |   .5005343   .0304855      .4410591    .5599944
          2  |   .4851343   .0306119      .4256343    .5450587
          3  |   .0143313   .0073775      .0051968     .038894
--------------------------------------------------------------

. estat ic

Akaike's information criterion and Bayesian information criterion

-----------------------------------------------------------------------------
       Model |        Obs  ll(null)  ll(model)      df         AIC        BIC
-------------+---------------------------------------------------------------
           . |        300         .  -187.4824      11    396.9648   437.7064
-----------------------------------------------------------------------------
               Note: N=Obs used in calculating BIC; see [R] BIC note.

. 
. /* 4 Component FMM */
. fmm 4, nolog: regress y ph

Finite mixture model                            Number of obs     =        300
Log likelihood = -188.06042

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
1.Class      |  (base outcome)
-------------+----------------------------------------------------------------
2.Class      |
       _cons |  -.6450345   .5853396    -1.10   0.270    -1.792279      .50221
-------------+----------------------------------------------------------------
3.Class      |
       _cons |  -.8026907   .6794755    -1.18   0.237    -2.134438    .5290568
-------------+----------------------------------------------------------------
4.Class      |
       _cons |  -3.484714   .5548643    -6.28   0.000    -4.572229     -2.3972
------------------------------------------------------------------------------

Class          : 1
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   5.173031   .0251474   205.71   0.000     5.123743    5.222319
       _cons |   41.65574    .161938   257.23   0.000     41.33835    41.97313
-------------+----------------------------------------------------------------
     var(e.y)|   .0617238   .0076596                      .0483975    .0787195
------------------------------------------------------------------------------

Class          : 2
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.503764   .0371216    40.51   0.000     1.431007    1.576521
       _cons |   65.13498   .2666049   244.31   0.000     64.61244    65.65751
-------------+----------------------------------------------------------------
     var(e.y)|   .0387473   .0188853                      .0149062    .1007195
------------------------------------------------------------------------------

Class          : 3
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.441334   .0443892    32.47   0.000     1.354333    1.528335
       _cons |   65.26791   .2765801   235.98   0.000     64.72582       65.81
-------------+----------------------------------------------------------------
     var(e.y)|   .0307352    .010982                      .0152578    .0619127
------------------------------------------------------------------------------

Class          : 4
Response       : y
Model          : regress

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y            |
          ph |   1.665207   .0079194   210.27   0.000     1.649685    1.680728
       _cons |   63.42577   .0510052  1243.52   0.000      63.3258    63.52573
-------------+----------------------------------------------------------------
     var(e.y)|    .000096   .0000769                        .00002    .0004611
------------------------------------------------------------------------------

. estat lcprob

Latent class marginal probabilities             Number of obs     =        300

--------------------------------------------------------------
             |            Delta-method
             |     Margin   Std. Err.     [95% Conf. Interval]
-------------+------------------------------------------------
       Class |
          1  |   .4991443   .0304808      .4396979     .558615
          2  |   .2618733   .1506066      .0715338    .6203076
          3  |   .2236773    .150279      .0501835    .6110804
          4  |    .015305    .008329       .005234    .0438994
--------------------------------------------------------------

. estat ic

Akaike's information criterion and Bayesian information criterion

-----------------------------------------------------------------------------
       Model |        Obs  ll(null)  ll(model)      df         AIC        BIC
-------------+---------------------------------------------------------------
           . |        300         .  -188.0604      15    406.1208   461.6776
-----------------------------------------------------------------------------
               Note: N=Obs used in calculating BIC; see [R] BIC note.

由于 Dason 已经涵盖了建模部分,因此我将重点关注统计显着性问题。

我不熟悉任何正式的测试(我确信存在),所以我只是提出一些想法(稍后我可能会添加 R 代码和技术细节)。

首先,推断类很方便。假设您有两条适合数据的线,您可以通过将每个点分配给最接近它的线的类来近似重建这两个类。对于十字路口附近的点,您会遇到问题,但现在只需忽略这些(可能有办法解决这个问题,但现在只希望这不会有太大变化)。

做到这一点的方法是选择xlxr(土壤 pH 值)与xlxr这样剩下的部分xl被充分分开和部分的权利xr充分分离(分布不重叠的最近点)。

然后,我认为有两种自然的方式可以做到这一点。

不太有趣的方法是通过线性回归运行原始数据集与推断的类标签,如 Demetri 的回答。

一个更有趣的方法是通过 ANOVA 的修改版本。重点是创建一个人工数据集来表示两条线(它们之间的分布相似),然后应用 ANOVA。从技术上讲,您需要为左侧执行一次,然后为右侧执行一次(即您将拥有两个人工数据集)。

我们从左边开始,应用一个简单的平均方法来得到两组。基本上,说第一类的每一点都是形式

y1(i)=β1,1x1(i)+β1,0+e1(i)
所以我们要替换线性表达式 β1,1x1(i)+β1,0 由一个常数,即线性项的平均值或
β1,1xavg+β1,0
在哪里xlavg从字面上看是平均值x左侧的值(重要的是,这在两个类中,因为这使事情更加一致)。也就是说,我们替换y1(i)
y~1(i)=β1,1xavg+β1,0+e1(i),
我们同样为二等。也就是说,您的新数据集由y~1(i)同样地y~2(i).

请注意,这两种方法自然地泛化为N类。