web-dev-qa-db-ja.com

Power BIの多重線形回帰

リターンのセットがあり、そのベータ値と異なる市場インデックスを計算したいとします。具体的な例を示すために、Returnsという名前のテーブルで次のデータセットを使用してみましょう。

  Date       Equity  Duration  Credit  Manager
-----------------------------------------------
01/31/2017   2.907%   0.226%   1.240%   1.78%
02/28/2017   2.513%   0.493%   1.120%   3.88%
03/31/2017   1.346%  -0.046%  -0.250%   0.13%
04/30/2017   1.612%   0.695%   0.620%   1.04%
05/31/2017   2.209%   0.653%   0.480%   1.40%
06/30/2017   0.796%  -0.162%   0.350%   0.63%
07/31/2017   2.733%   0.167%   0.830%   2.06%
08/31/2017   0.401%   1.083%  -0.670%   0.29%
09/30/2017   1.880%  -0.857%   1.430%   2.04%
10/31/2017   2.151%  -0.121%   0.510%   2.33%
11/30/2017   2.020%  -0.137%  -0.020%   3.06%
12/31/2017   1.454%   0.309%   0.230%   1.28%

Excelでは、LINEST関数を使用してベータ値を取得できます。

= LINEST(Returns[Manager], Returns[[Equity]:[Credit]], TRUE, TRUE)

次のような配列を吐き出します。

0.077250253 -0.184974002  0.961578127 -0.001063971
0.707796954  0.60202895   0.540811546  0.008257129
0.50202386   0.009166729  #N/A         #N/A
2.688342242  8            #N/A         #N/A
0.000677695  0.000672231  #N/A         #N/A

ベータは一番上の行にあり、それらを使用すると次の線形推定が得られます。

Manager = 0.962 * Equity - 0.185 * Duration + 0.077 * Credit - 0.001

問題は、DAXを使用して(できればカスタムRスクリプトを記述せずに)Power BIでこれらの値を取得するにはどうすればよいですか?


単純な線形回帰 の1つの列に対して、数学的定義に戻って、 この投稿 で指定されたものと同様の最小二乗実装を記述できます。

しかし、より多くの列が関与するようになると(最大12列を実行できるようにする必要がありますが、常に同じ数である必要はありません)、これは非常に乱雑になり、より良い方法があることを願っています。

8
Alexis Olson

本質:

DAXは進むべき道ではありません。 _Home > Edit Queries_を使用し、次に_Transform > Run R Script_を使用します。次のRスニペットを挿入して、テーブルで使用可能なすべての変数を使用して回帰分析を実行します。

_model <- lm(Manager ~ . , dataset)
df<- data.frame(coef(model))
names(df)[names(df)=="coef.model."] <- "coefficients"
df['variables'] <- row.names(df)
_

Managerを他の使用可能な変数名に編集して、従属変数を変更します。


詳細:

良い質問!マイクロソフトがより柔軟なソリューションを導入しなかった理由は、私の理解を超えています。しかし、現時点では、Power BIでRを使用しない限り、非常に優れたアプローチを見つけることはできません。

したがって、私の提案するアプローチでは、以下に関するリクエストは無視されます。

問題は、DAXを使用して(できればカスタムRスクリプトを記述せずに)Power BIでこれらの値を取得するにはどうすればよいですか?

私の答えは、しかし、以下に関するあなたの要件を満たします:

良い答えは、3つ以上の列に一般化する必要があります(おそらく、列ヘッダーではなく値としてインデックスを持つピボットされていないデータテーブルで作業することによって)。

さあ行こう:


小数点記号としてカンマを使用しているシステムを使用しているので、次のものをデータソースとして使用します(数値をPower BIに直接コピーすると、列の分離は維持されません。最初に貼り付けた場合それをExcelにコピーし、もう一度コピーしてから、Power BIに貼り付けます。列は問題ありません):

_Date    Equity  Duration    Credit  Manager
31.01.2017  2,907   0,226   1,24    1,78
28.02.2017  2,513   0,493   1,12    3,88
31.03.2017  1,346   -0,046  -0,25   0,13
30.04.2017  1,612   0,695   0,62    1,04
31.05.2017  2,209   0,653   0,48    1,4
30.06.2017  0,796   -0,162  0,35    0,63
31.07.2017  2,733   0,167   0,83    2,06
31.08.2017  0,401   1,083   -0,67   0,29
30.09.2017  1,88    -0,857  1,43    2,04
31.10.2017  2,151   -0,121  0,51    2,33
30.11.2017  2,02    -0,137  -0,02   3,06
31.12.2017  1,454   0,309   0,23    1,28
_

Power BIで最初から(再現性の目的で)_Enter Data_を使用してデータを挿入しています:

enter image description here

次に、_Edit Queries > Edit Queries_に移動し、次のことを確認します。

enter image description here

分析に含める列の数に関して柔軟性を維持するために、Date列を削除するのが最善の方法です。これは、回帰結果に影響を与えません。 [日付]列を右クリックして、[Remove]を選択するだけです。

enter image description here

これにより、_Query Settings > Applied Steps_>の下に新しいステップが追加されます。

enter image description here

そして、ここで、使用するRコードの数行を編集できます。次に、_Transform > Run R Script_に移動してこのウィンドウを開きます。

enter image description here

行_# 'dataset' holds the input data for this script_に注目してください。ありがたいことに、あなたの質問は1つの入力テーブルのみに関するものなので、物事が複雑になりすぎることはありません(複数の入力テーブルについては、チェックアウト この投稿 )。 dataset変数は、Rのdata.frame形式の変数であり、さらに分析するための良い(唯一の)出発点です。

次のスクリプトを挿入します。

_model <- lm(Manager ~ . , dataset)
df<- data.frame(coef(model))
names(df)[names(df)=="coef.model."] <- "coefficients"
df['variables'] <- row.names(df)
_

enter image description here

OKをクリックします。問題がなければ、次のようになります。

enter image description here

Tableをクリックすると、次のようになります。

enter image description here

_Applied Steps_の下に、_Run R Script_ステップが挿入されていることを確認します。右側の星(歯車?)をクリックして編集するか、dfをクリックして出力テーブルをフォーマットします。

これで終わりです!Edit Queriesパートでは少なくとも。

_Home > Close & Apply_をクリックしてPower BIレポートセクションに戻り、_Visualizations > Fields_の下に新しいテーブルがあることを確認します。

enter image description here

これを取得するには、テーブルまたはマトリックスを挿入し、係数と変数をアクティブにします。

enter image description here

これがあなたが探していたものであることを願っています!


次に、Rスクリプトの詳細について説明します。

可能な限り、さまざまなRライブラリを使用することは避けます。これにより、依存関係の問題のリスクを軽減できます。

関数lm()は、回帰分析を処理します。説明変数の数に関して必要な柔軟性を得る鍵は、_Manager ~ . , dataset_の部分にあります。これは単に、データフレームManagerdataset変数に対して回帰分析を実行し、残りのすべての列_~ ._を説明変数として使用することを示しています。 coef(model)部分は、推定モデルから係数値を抽出します。結果は、行名として変数名を持つデータフレームです。最後の行は、これらの名前をデータフレーム自体に追加するだけです。

7
vestland

Power BIにはLINEST関数に相当する、または便利な代替機能がないため(質問を投稿する前に十分な調査を行ったと思います)、試みはPower Query/Mで関数全体を書き換えることを意味します。これは、単純な線形回帰の場合の「単純」ではなく、複数の変数については言うまでもありません。

車輪を(再)発明するよりも、Power BIのRスクリプトでそれを行う方が必然的にはるかに簡単です(1行のコード..)。

私が以前にRの経験がないことを考えると、それは悪い選択肢ではありません。数回の検索と試行錯誤の後、これを思いつくことができます。

# 'dataset' holds the input data for this script
# install.packages("broom") # uncomment to install if package does not exist
library(broom)

model <- lm(Manager ~ Equity + Duration + Credit, dataset)
model <- tidy(model)

lmはRからの組み込み 線形モデル関数 であり、tidy関数はbroomパッケージに付属しています tidies Power BIの場合、出力をアップしてデータフレームを出力します

result

termおよびestimateを使用すると、必要な見積もりを計算するにはこれで十分です。

参考のためのMクエリ:

let
    Source = Csv.Document(File.Contents("returns.csv"),[Delimiter=",", Columns=5, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Date", type text}, {"Equity", Percentage.Type}, {"Duration", Percentage.Type}, {"Credit", Percentage.Type}, {"Manager", Percentage.Type}}),
    #"Run R Script" = R.Execute("# 'dataset' holds the input data for this script#(lf)# install.packages(""broom"")#(lf)library(broom)#(lf)#(lf)model <- lm(Manager ~ Equity + Duration + Credit, dataset)#(lf)model <- tidy(model)",[dataset=#"Changed Type"]),
    #"""model""" = #"Run R Script"{[Name="model"]}[Value]
in
    #"""model"""
3
Foxan Ng