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


34

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

但是,当我开始研究时,并没有意识到该种群实际上含有两种水仙花,每种水仙花对土壤pH的反应都非常不同。因此,该图包含两个不同的线性关系:

土壤pH值与花高(cm)

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

问题:

  1. 是否有统计检验来确定一个数据集适合单行还是N行?

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

我可以想到一些组合方法,但它们在计算上似乎很昂贵。


说明:

  1. 在数据收集时,尚不存在两种变体。未观察到,未记录和未记录每种水仙花的变化。

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

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



3
你知道哪个达福地是哪个品种吗?如果是这样,那么您只需将这些信息包括到模型中即可
rep_ho

1
这似乎是统计交互的经典案例,就像@Demetri Pananos的答案一样。
rolando2

2
我感觉到他们没有数据中花朵的品种信息。我同意,如果他们有,那就只是建立一个交互模型,甚至只是为每个品种运行单独的回归。但是,如果他们没有该信息,就不会失去所有希望。可以建立一个模型,该模型不仅可以估计单独的直线,还可以预测每个观测值属于任一组的概率。
戴森

1
@DemetriPananos我提供了一个有希望的答案。根据他们想做什么,还有很多工作要做。要进行某种测试,您需要进行似然比测试或某种随机化测试或其他方法。但是他们并没有给我们太多信息,如果目标只是使线条适合并且没有标签,那么使用mixtools包也不错。
戴森

Answers:


31

如果我们假设您具有不同品种的标签,那么我认为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的分割,因此很好。

我用于仿真的“ true”值应为:

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拟合的线


21

编辑:我本来以为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


如果OP事先知道了水仙花的品种,为什么他们不能将数据分为两部分,并对每个品种进行两个单独的回归分析呢?
Akavall

如果OP对水仙花品种之间的差异不感兴趣(例如,在土壤pH值条件下,品种1的生长是否高于品种2的生长),则没有理由将所有数据一起回归,除非围绕精度的争论可能。
Demetri Pananos

@Akavail-他们可以拆分数据,但如果他们有兴趣测试有关品种之间差异的任何假设,则可以像这样运行数据,这使得进行任何类型的比较变得更加容易。如果相等方差假设有效,则将其组合运行还将给出更好的估计。
戴森

1
在研究EM方法之前,我曾考虑过贝叶斯方法。但是,尽管我喜欢贝叶斯的做事方式,但我还是很懒惰,而采用EM方法要容易得多。话虽如此,我还是更喜欢贝叶斯分析,而且我认为它也使回答后续问题变得更加容易-您可能很难编写初始模型,但是一旦完成,回答问题的难度就会大大提高。后部分布。
戴森

2

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

这是一个Stata示例,它使用具有2-4个潜在类/分量的一系列有限混合模型(FMM)。第一个表是潜在类成员资格的系数。这些有点难以解释,但是可以稍后用转换为概率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.

谢谢您这个非常有趣的答案。您给了我一些新概念进行研究!
SlowMagic

0

由于Dason已经介绍了建模部分,因此我将集中讨论统计意义上的问题。

我对此不熟悉任何正式的测试(我确定确实存在),因此我将提出一些想法(稍后可能会添加R代码和技术细节)。

首先,推断类很方便。假设您有两条线适合数据,则可以通过将每个点分配给最接近它的线的类来大致重构这两个类。对于相交附近的点,您会遇到问题,但现在就忽略它们(可能有一种解决方法,但现在只是希望不会有太大变化)。

xlxrxlxrxlxr

然后,我发现有两种自然的方法可以做到这一点。

不太有趣的方法是像Demetri的答案一样,通过线性回归来运行原始数据集和推断的类标签。

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

y1(i)=β1,1x1(i)+β1,0+e1(i)
β1,1x1(i)+β1,0
β1,1xavg+β1,0
xlavgxy1(i)
y~1(i)=β1,1xavg+β1,0+e1(i),
y~1(i)y~2(i)

N


-2

将两者都包含在同一图表中是否有可能出错?鉴于品种表现完全不同,重叠数据是否有任何价值?在我看来,您是在寻找对某种水仙花的影响,而不是在类似环境下对不同水仙花的影响。如果您丢失了有助于从物种“ B”中确定物种“ A”的数据,则可以简单地将行为“ A”和行为“ B”分组,并在叙述中包括两个物种的发现。或者,如果您确实想要一张图表,只需在同一轴上使用两个数据集。我没有其他回应中所见的专业知识,因此我不得不寻找较少的“熟练”方法。我会在一个工作表环境中运行数据分析,在该环境中方程很容易开发。然后,一旦分组变得明显,请创建两个单独的数据表,然后将它们转换为图表/图形。我处理大量数据,但经常发现我对不同相关性的假设是错误的;那就是数据应该可以帮助我们发现的东西。一旦得知自己的假设是错误的,我便根据发现的行为显示数据,并讨论这些行为以及由此产生的统计分析,作为叙述的一部分。


1
我想您是被否决的,因为您的回答并未提供任何清晰或洞察力来回答问题。您需要更有效地安排答案,并清楚说明每个问题要解决的子问题。该问题已在答案之间和答案之前进行了更新,以明确指出该品种信息不可用且无法恢复。
ReneBt

2
欢迎使用交叉验证!请不要因为您的第一个答案不被人们所接受而推迟-更简单的解决方案可能会非常有用-但由于发问者已经说过“当然,我可以专心致志并手动将其分开”,因此似乎没有增加很多。
Scortchi-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.