多変量線形モデル - MultivariateLS

このノートブックは、最小二乗法で推定された多変量線形モデルのいくつかの特徴を示します。
例は、UCLAの統計例に基づいています。

このモデルは、複数の従属変数が同じ説明変数のセットに線形に依存していると仮定します。

\[Y = X * B + u\]

ここで、

  • 従属変数(内生変数)Y は形状 (nobs, k_endog)、

  • 定数を含む説明変数行列(外生変数)X は形状 (nobs, k_exog)、

  • パラメータ行列 B は形状 (k_exog, k_endog)、すなわち説明変数の係数が行に、従属変数の係数が列に配置されています。

  • 誤差項 uY と同じ形状 (nobs, k_endog) を持ち、平均がゼロであり、X と相関していないと仮定されています。

推定は最小二乗法によって行われます。各従属変数に対する共通の説明変数を使ったパラメータ推定値は、各 endog に対する個別のOLS推定値に対応します。
多変量モデルの主な利点は、推論を行うことができる点です。
[1]:
import os
import numpy as np

import pandas as pd

from statsmodels.base.model import LikelihoodModel
from statsmodels.regression.linear_model import OLS
from statsmodels.multivariate.manova import MANOVA
from statsmodels.multivariate.multivariate_ols import MultivariateLS

import statsmodels.multivariate.tests.results as path
dir_path = os.path.dirname(os.path.abspath(path.__file__))
csv_path = os.path.join(dir_path, 'mvreg.csv')
data_mvreg = pd.read_csv(csv_path)
[2]:
data_mvreg.head()
[2]:
locus_of_control self_concept motivation read write science prog
0 -1.143955 0.722641 0.368973 37.405548 39.032845 33.532822 academic
1 0.504134 0.111364 0.520319 52.760784 51.995041 65.225044 academic
2 1.628546 0.629934 0.436838 59.771915 54.651653 64.604500 academic
3 0.368096 -0.138528 -0.004324 42.854324 41.121357 48.493809 vocational
4 -0.280190 -0.452226 1.256924 54.756279 49.947208 50.381657 academic
[3]:
formula = "locus_of_control + self_concept + motivation ~ read + write + science + prog"
mod = MultivariateLS.from_formula(formula, data=data_mvreg)
res = mod.fit()

多変量仮説検定 mv_test

mv_test メソッドは、デフォルトで、式の各項が従属変数(endog)に対して影響を与えないという仮説検定を行います。これはMANOVA検定と同じです。
注意すべき点は、statsmodels のMANOVAは、多変量モデルの係数に対する検定として実装されており、カテゴリー変数に限定されていないことです。現在の例では、定数に加えて3つの連続変数と1つのカテゴリー変数の説明変数があります。
そのため、mv_testMultivariateLS と MANOVA に適用すると、同じ結果が得られます。
ただし、MANOVAは仮説検定を機能として提供するのみで、MultivariateLS は通常のモデル結果を提供します。
mv_test のより一般的なバージョンは、仮説が L B M = C という形で表されます。
ここで、L は説明変数に対応する制約、M は従属変数(endog)に対応する制約、C はアフィン制約のための定数行列です。詳細については、ドキュメンテーション文字列を参照してください。
[4]:
mvt = res.mv_test()
mvt.summary_frame
[4]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
Intercept Wilks' lambda 0.848467 3 592.0 35.242876 0.0
Pillai's trace 0.151533 3.0 592.0 35.242876 0.0
Hotelling-Lawley trace 0.178596 3 592.0 35.242876 0.0
Roy's greatest root 0.178596 3 592 35.242876 0.0
prog Wilks' lambda 0.891438 6 1184.0 11.670765 0.0
Pillai's trace 0.108649 6.0 1186.0 11.354963 0.0
Hotelling-Lawley trace 0.121685 6 787.558061 11.996155 0.0
Roy's greatest root 0.120878 3 593 23.893456 0.0
read Wilks' lambda 0.976425 3 592.0 4.764416 0.002727
Pillai's trace 0.023575 3.0 592.0 4.764416 0.002727
Hotelling-Lawley trace 0.024144 3 592.0 4.764416 0.002727
Roy's greatest root 0.024144 3 592 4.764416 0.002727
write Wilks' lambda 0.947394 3 592.0 10.957338 0.000001
Pillai's trace 0.052606 3.0 592.0 10.957338 0.000001
Hotelling-Lawley trace 0.055527 3 592.0 10.957338 0.000001
Roy's greatest root 0.055527 3 592 10.957338 0.000001
science Wilks' lambda 0.983405 3 592.0 3.329911 0.019305
Pillai's trace 0.016595 3.0 592.0 3.329911 0.019305
Hotelling-Lawley trace 0.016875 3 592.0 3.329911 0.019305
Roy's greatest root 0.016875 3 592 3.329911 0.019305
[5]:
manova = MANOVA.from_formula(formula, data=data_mvreg)
manova.mv_test().summary_frame
[5]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
Intercept Wilks' lambda 0.848467 3 592.0 35.242876 0.0
Pillai's trace 0.151533 3.0 592.0 35.242876 0.0
Hotelling-Lawley trace 0.178596 3 592.0 35.242876 0.0
Roy's greatest root 0.178596 3 592 35.242876 0.0
prog Wilks' lambda 0.891438 6 1184.0 11.670765 0.0
Pillai's trace 0.108649 6.0 1186.0 11.354963 0.0
Hotelling-Lawley trace 0.121685 6 787.558061 11.996155 0.0
Roy's greatest root 0.120878 3 593 23.893456 0.0
read Wilks' lambda 0.976425 3 592.0 4.764416 0.002727
Pillai's trace 0.023575 3.0 592.0 4.764416 0.002727
Hotelling-Lawley trace 0.024144 3 592.0 4.764416 0.002727
Roy's greatest root 0.024144 3 592 4.764416 0.002727
write Wilks' lambda 0.947394 3 592.0 10.957338 0.000001
Pillai's trace 0.052606 3.0 592.0 10.957338 0.000001
Hotelling-Lawley trace 0.055527 3 592.0 10.957338 0.000001
Roy's greatest root 0.055527 3 592 10.957338 0.000001
science Wilks' lambda 0.983405 3 592.0 3.329911 0.019305
Pillai's trace 0.016595 3.0 592.0 3.329911 0.019305
Hotelling-Lawley trace 0.016875 3 592.0 3.329911 0.019305
Roy's greatest root 0.016875 3 592 3.329911 0.019305

コアとなる重回帰分析の結果は、summary メソッドによって表示されます。

[6]:
print(res.summary())
                                      MultivariateLS Regression Results
==============================================================================================================
Dep. Variable:     ['locus_of_control', 'self_concept', 'motivation']   No. Observations:                  600
Model:                                                 MultivariateLS   Df Residuals:                      594
Method:                                                 Least Squares   Df Model:                           15
Date:                                                Thu, 28 Nov 2024
Time:                                                        23:10:52
======================================================================================
  locus_of_control       coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
Intercept             -1.4970      0.157     -9.505      0.000      -1.806      -1.188
prog[T.general]       -0.1278      0.064     -1.998      0.046      -0.253      -0.002
prog[T.vocational]     0.1239      0.058      2.150      0.032       0.011       0.237
read                   0.0125      0.004      3.363      0.001       0.005       0.020
write                  0.0121      0.003      3.581      0.000       0.005       0.019
science                0.0058      0.004      1.582      0.114      -0.001       0.013
--------------------------------------------------------------------------------------
      self_concept       coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
Intercept             -0.0959      0.179     -0.536      0.592      -0.447       0.255
prog[T.general]       -0.2765      0.073     -3.808      0.000      -0.419      -0.134
prog[T.vocational]     0.1469      0.065      2.246      0.025       0.018       0.275
read                   0.0013      0.004      0.310      0.757      -0.007       0.010
write                 -0.0043      0.004     -1.115      0.265      -0.012       0.003
science                0.0053      0.004      1.284      0.200      -0.003       0.013
--------------------------------------------------------------------------------------
        motivation       coef    std err          t      P>|t|      [0.025      0.975]
--------------------------------------------------------------------------------------
Intercept             -0.9505      0.198     -4.811      0.000      -1.339      -0.563
prog[T.general]       -0.3603      0.080     -4.492      0.000      -0.518      -0.203
prog[T.vocational]     0.2594      0.072      3.589      0.000       0.117       0.401
read                   0.0097      0.005      2.074      0.038       0.001       0.019
write                  0.0175      0.004      4.122      0.000       0.009       0.026
science               -0.0090      0.005     -1.971      0.049      -0.018   -3.13e-05
======================================================================================

標準的な結果属性であるパラメータ推定値(params)、標準誤差(bse)、t値(tvalues)、p値(pvalues)は、説明変数(exog)が行に、従属変数(endog)が列に配置された2次元配列またはデータフレームです。

[7]:
res.params
[7]:
0 1 2
Intercept -1.496970 -0.095858 -0.950513
prog[T.general] -0.127795 -0.276483 -0.360329
prog[T.vocational] 0.123875 0.146876 0.259367
read 0.012505 0.001308 0.009674
write 0.012145 -0.004293 0.017535
science 0.005761 0.005306 -0.009001
[8]:
res.bse
[8]:
0 1 2
Intercept 0.157499 0.178794 0.197563
prog[T.general] 0.063955 0.072602 0.080224
prog[T.vocational] 0.057607 0.065396 0.072261
read 0.003718 0.004220 0.004664
write 0.003391 0.003850 0.004254
science 0.003641 0.004133 0.004567
[9]:
res.pvalues
[9]:
0 1 2
Intercept 4.887129e-20 0.592066 0.000002
prog[T.general] 4.615006e-02 0.000155 0.000008
prog[T.vocational] 3.193055e-02 0.025075 0.000359
read 8.192738e-04 0.756801 0.038481
write 3.700449e-04 0.265214 0.000043
science 1.141093e-01 0.199765 0.049209

一般的なMVおよびWald検定

多変量線形モデルでは、L B M 形式での多変量検定や、パラメータの線形結合に基づく標準的なWald検定が可能です。

多変量検定は、行列の固有値やトレースに基づいています。Wald検定は、パラメータのフラット(積み重ねた)配列とその共分散に基づく標準的な検定であり、仮説は R b = c の形式で、ここで b は列方向に積み重ねられたパラメータ配列です。検定はモデルの仮定の下で漸近的に同等ですが、小さい標本では異なります。

線形制約は、仮説行列(numpy配列)として定義することも、文字列または文字列のリストとして定義することもできます。

[10]:
yn = res.model.endog_names
xn = res.model.exog_names
yn, xn
[10]:
(['locus_of_control', 'self_concept', 'motivation'],
 ['Intercept',
  'prog[T.general]',
  'prog[T.vocational]',
  'read',
  'write',
  'science'])
[11]:
# test for an individual coefficient

mvt = res.mv_test(hypotheses=[("coef", ["science"], ["locus_of_control"])])
mvt.summary_frame
[11]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
coef Wilks' lambda 0.995803 1 594.0 2.50373 0.114109
Pillai's trace 0.004197 1.0 594.0 2.50373 0.114109
Hotelling-Lawley trace 0.004215 1 594.0 2.50373 0.114109
Roy's greatest root 0.004215 1 594 2.50373 0.114109
[12]:
tt = res.t_test("ylocus_of_control_science")
tt, tt.pvalue
[12]:
(<class 'statsmodels.stats.contrast.ContrastResults'>
                              Test for Constraints
 ==============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
 ------------------------------------------------------------------------------
 c0             0.0058      0.004      1.582      0.114      -0.001       0.013
 ==============================================================================,
 array(0.11410929))

説明変数が従属変数のいずれにも影響を与えないという共同仮説、すなわち説明変数のすべての係数がゼロであるという仮説に対して、mv_test または wald_test のいずれかを使用できます。

この例では、p値は小数点以下3桁で一致しています。

[13]:
wt = res.wald_test(["ylocus_of_control_science", "yself_concept_science", "ymotivation_science"], scalar=True)
wt
[13]:
<class 'statsmodels.stats.contrast.ContrastResults'>
<F test: F=3.3411603250015367, p=0.019011634301734325, df_denom=594, df_num=3>
[14]:
mvt = res.mv_test(hypotheses=[("science", ["science"], yn)])
mvt.summary_frame
[14]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
science Wilks' lambda 0.983405 3 592.0 3.329911 0.019305
Pillai's trace 0.016595 3.0 592.0 3.329911 0.019305
Hotelling-Lawley trace 0.016875 3 592.0 3.329911 0.019305
Roy's greatest root 0.016875 3 592 3.329911 0.019305
[15]:
# t_test provides a vectorized results for each of the simple hypotheses

tt = res.t_test(["ylocus_of_control_science", "yself_concept_science", "ymotivation_science"])
tt, tt.pvalue
[15]:
(<class 'statsmodels.stats.contrast.ContrastResults'>
                              Test for Constraints
 ==============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
 ------------------------------------------------------------------------------
 c0             0.0058      0.004      1.582      0.114      -0.001       0.013
 c1             0.0053      0.004      1.284      0.200      -0.003       0.013
 c2            -0.0090      0.005     -1.971      0.049      -0.018   -3.13e-05
 ==============================================================================,
 array([0.11410929, 0.19976543, 0.0492095 ]))

警告: t_test および wald_test で使用される平坦化されたパラメータ名の命名パターンは、今後変更される可能性があります。

現在のパターンは "y{endog_name}_{exog_name}" です。

例:

[16]:
[f"y{endog_name}_{exog_name}" for endog_name in yn for exog_name in ["science"]]
[16]:
['ylocus_of_control_science', 'yself_concept_science', 'ymotivation_science']
[17]:
c = [f"y{endog_name}_{exog_name}" for endog_name in yn for exog_name in ["prog[T.general]", "prog[T.vocational]"]]
c
[17]:
['ylocus_of_control_prog[T.general]',
 'ylocus_of_control_prog[T.vocational]',
 'yself_concept_prog[T.general]',
 'yself_concept_prog[T.vocational]',
 'ymotivation_prog[T.general]',
 'ymotivation_prog[T.vocational]']

前述の制限は、カテゴリー変数「prog」が効果を持たないというMANOVA型の検定に対応しています。

[18]:
mant = manova.mv_test().summary_frame
mant.loc["prog"] #["Pr > F"].to_numpy()
[18]:
Value Num DF Den DF F Value Pr > F
Statistic
Wilks' lambda 0.891438 6 1184.0 11.670765 0.0
Pillai's trace 0.108649 6.0 1186.0 11.354963 0.0
Hotelling-Lawley trace 0.121685 6 787.558061 11.996155 0.0
Roy's greatest root 0.120878 3 593 23.893456 0.0
[19]:
res.wald_test(c, scalar=True)
[19]:
<class 'statsmodels.stats.contrast.ContrastResults'>
<F test: F=12.046814522691678, p=8.548081236478633e-13, df_denom=594, df_num=6>

注意: 自由度は仮説検定方法によって異なります。 このモデルは、nobs=600 の場合の多変量モデルとして、または nobs_total = nobs * k_endog = 1800 のスタックモデルとして考えることができます。

内生変数制限の場合、推定値の共分散に基づいて推論が行われますが、これはMultivariateLSとOLSで同じです。単一出力OLSにおける自由度は df_resid = 600 - 6 = 594 です。同じ自由度をMultivariateLSで使用することで、各内生変数の分析において等価性が保たれます。仮説検定に対して総自由度 df_resid を使用すると、検定がより緩くなります。

正規分布およびカイ二乗分布に基づく漸近推論(use_t=False)は、df_resid の定義方法に影響されません。

Wald検定で異なる自由度を選択できる追加オプションが提供されるかどうかはまだ決まっていません。

[20]:
res.df_resid
[20]:
594

mv_test と wald_test は、係数間の対比に関する仮説を検定するために使用できます。

[21]:
c = [f"y{endog_name}_prog[T.general] - y{endog_name}_prog[T.vocational]" for endog_name in yn]
c
[21]:
['ylocus_of_control_prog[T.general] - ylocus_of_control_prog[T.vocational]',
 'yself_concept_prog[T.general] - yself_concept_prog[T.vocational]',
 'ymotivation_prog[T.general] - ymotivation_prog[T.vocational]']
[22]:
res.wald_test(c, scalar=True)
[22]:
<class 'statsmodels.stats.contrast.ContrastResults'>
<F test: F=23.92940926897951, p=1.2456536486107317e-14, df_denom=594, df_num=3>
[23]:
mvt = res.mv_test(hypotheses=[("diff_prog", ["prog[T.general] - prog[T.vocational]"], yn)])
mvt.summary_frame
[23]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
diff_prog Wilks' lambda 0.892176 3 592.0 23.848839 0.0
Pillai's trace 0.107824 3.0 592.0 23.848839 0.0
Hotelling-Lawley trace 0.120856 3 592.0 23.848839 0.0
Roy's greatest root 0.120856 3 592 23.848839 0.0

例:内生変数の方程式間で係数が同じであるという仮説。

後の2つの方程式のパラメータと最初の方程式のパラメータの差がゼロであることを検定できます。

[24]:
mvt = res.mv_test(hypotheses=[("diff_prog", xn, ["self_concept - locus_of_control", "motivation - locus_of_control"])])
mvt.summary_frame
[24]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
diff_prog Wilks' lambda 0.867039 12 1186.0 7.307879 0.0
Pillai's trace 0.13714 12.0 1188.0 7.28819 0.0
Hotelling-Lawley trace 0.14853 12 919.36321 7.331042 0.0
Roy's greatest root 0.100625 6 594 9.961898 0.0

同様の仮説検定では、方程式が同じ傾き係数を持つが異なる定数を持つことを検定することができます。

[25]:
xn[1:]
[25]:
['prog[T.general]', 'prog[T.vocational]', 'read', 'write', 'science']
[26]:
mvt = res.mv_test(hypotheses=[("diff_prog", xn[1:], ["self_concept - locus_of_control", "motivation - locus_of_control"])])
mvt.summary_frame
[26]:
Value Num DF Den DF F Value Pr > F
Effect Statistic
diff_prog Wilks' lambda 0.879133 10 1186.0 7.890322 0.0
Pillai's trace 0.124212 10.0 1188.0 7.866738 0.0
Hotelling-Lawley trace 0.133679 10 886.75443 7.918284 0.0
Roy's greatest root 0.092581 5 594 10.998679 0.0

予測

回帰モデルとその結果のインスタンスには、予測と残差のためのメソッドがあります。

注意点として、パラメータの推定値は個別の内生変数に対するOLS推定と同じであるため、予測もMultivariateLSモデルと個別のOLSモデルのセットで同じになります。

[27]:
res.resid
[27]:
locus_of_control self_concept motivation
0 -0.781981 0.759249 0.575027
1 0.334075 0.015388 0.635811
2 1.342126 0.539488 0.432337
3 0.426497 -0.326337 -0.012298
4 -0.364810 -0.480846 1.255411
... ... ... ...
595 -1.849566 0.920851 -0.318799
596 -1.278212 -1.080592 -0.031575
597 -1.060668 -1.065596 -1.577958
598 -0.661946 0.368192 0.132774
599 -0.129760 0.702698 1.020835

600 rows × 3 columns

[28]:
res.predict()
[28]:
array([[-0.36197321, -0.03660735, -0.2060539 ],
       [ 0.17005867,  0.09597616, -0.11549243],
       [ 0.28641963,  0.09044546,  0.00450077],
       ...,
       [ 0.6252098 , -0.23716973,  0.11864199],
       [-0.3024846 , -0.29586741, -0.47584179],
       [ 0.77574136,  0.2878978 ,  0.42480766]])
[29]:
res.predict(data_mvreg)
[29]:
0 1 2
0 -0.361973 -0.036607 -0.206054
1 0.170059 0.095976 -0.115492
2 0.286420 0.090445 0.004501
3 -0.058400 0.187809 0.007974
4 0.084621 0.028620 0.001513
... ... ... ...
595 0.185458 0.036897 0.034498
596 0.330408 0.097329 0.489407
597 0.625210 -0.237170 0.118642
598 -0.302485 -0.295867 -0.475842
599 0.775741 0.287898 0.424808

600 rows × 3 columns

[30]:
res.fittedvalues
[30]:
locus_of_control self_concept motivation
0 -0.361973 -0.036607 -0.206054
1 0.170059 0.095976 -0.115492
2 0.286420 0.090445 0.004501
3 -0.058400 0.187809 0.007974
4 0.084621 0.028620 0.001513
... ... ... ...
595 0.185458 0.036897 0.034498
596 0.330408 0.097329 0.489407
597 0.625210 -0.237170 0.118642
598 -0.302485 -0.295867 -0.475842
599 0.775741 0.287898 0.424808

600 rows × 3 columns

予測メソッドは、ユーザーが提供した説明変数のデータを受け取ることができますが、現在のところ、興味深い効果に対する説明変数のセットを自動的に作成することはできません。

以下では、連続変数の標本平均でカテゴリ変数「prog」の各レベルに対する従属変数の条件付き期待値を予測するために使用できるデータフレームを構築します。

[31]:
data_exog = data_mvreg[['read', 'write', 'science', 'prog']]

ex = pd.DataFrame(data_exog["prog"].unique(), columns=["prog"])
mean_ex = data_mvreg[['read', 'write', 'science']].mean()

ex[['read', 'write', 'science']] = mean_ex
ex
C:\Users\user\AppData\Local\Temp\ipykernel_22276\2303137861.py:6: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  ex[['read', 'write', 'science']] = mean_ex
C:\Users\user\AppData\Local\Temp\ipykernel_22276\2303137861.py:6: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  ex[['read', 'write', 'science']] = mean_ex
C:\Users\user\AppData\Local\Temp\ipykernel_22276\2303137861.py:6: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  ex[['read', 'write', 'science']] = mean_ex
[31]:
prog read write science
0 academic 51.901833 52.384833 51.763333
1 vocational 51.901833 52.384833 51.763333
2 general 51.901833 52.384833 51.763333
[32]:
pred = res.predict(ex)

pred.index = ex["prog"]
pred.columns = res.fittedvalues.columns
print("predicted mean by 'prog':")
pred
predicted mean by 'prog':
[32]:
locus_of_control self_concept motivation
prog
academic 0.086493 0.021752 0.004209
vocational 0.210368 0.168628 0.263575
general -0.041303 -0.254731 -0.356121

外れ値の影響 (Outlier-Influence)

これは現在ドラフト版です。
resid_distance は、各標本観測値に対するマハラノビス距離に基づいた1次元の残差測定値です。
MultivariateLSモデルのハット行列はOLSと同じであり、ハット行列の対角線は一時的に results._hat_matrix_diag として付加されています。

なお、重回帰分析における個々の従属変数の成分はOLSで分析可能であり、OLSInfluence などの対応する事後推定手法で利用できます。

[33]:
res.resid_distance[:5]
[33]:
array([3.74332128, 0.95395412, 5.15221877, 0.82580531, 4.5260778 ])
[34]:
res.cov_resid
[34]:
array([[0.36844484, 0.05748939, 0.06050103],
       [0.05748939, 0.4748153 , 0.13103368],
       [0.06050103, 0.13103368, 0.57973305]])
[35]:
import matplotlib.pyplot as plt
[36]:
plt.plot(res.resid_distance)
[36]:
[<matplotlib.lines.Line2D at 0x177890f42b0>]
../../../_images/examples_notebooks_generated_multivariate_ls_50_1.png
[37]:
plt.plot(res._hat_matrix_diag)
[37]:
[<matplotlib.lines.Line2D at 0x17789315e10>]
../../../_images/examples_notebooks_generated_multivariate_ls_51_1.png
[38]:
plt.plot(res._hat_matrix_diag, res.resid_distance, ".")
[38]:
[<matplotlib.lines.Line2D at 0x1778a384be0>]
../../../_images/examples_notebooks_generated_multivariate_ls_52_1.png
[ ]:


最終更新日: 2025年01月28日