リターンのセットがあり、そのベータ値と異なる市場インデックスを計算したいとします。具体的な例を示すために、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列を実行できるようにする必要がありますが、常に同じ数である必要はありません)、これは非常に乱雑になり、より良い方法があることを願っています。
本質:
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
_を使用してデータを挿入しています:
次に、_Edit Queries > Edit Queries
_に移動し、次のことを確認します。
分析に含める列の数に関して柔軟性を維持するために、Date列を削除するのが最善の方法です。これは、回帰結果に影響を与えません。 [日付]列を右クリックして、[Remove
]を選択するだけです。
これにより、_Query Settings > Applied Steps
_>の下に新しいステップが追加されます。
そして、ここで、使用するRコードの数行を編集できます。次に、_Transform > Run R Script
_に移動してこのウィンドウを開きます。
行_# '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)
_
OK
をクリックします。問題がなければ、次のようになります。
Table
をクリックすると、次のようになります。
_Applied Steps
_の下に、_Run R Script
_ステップが挿入されていることを確認します。右側の星(歯車?)をクリックして編集するか、df
をクリックして出力テーブルをフォーマットします。
これで終わりです!Edit Queriesパートでは少なくとも。
_Home > Close & Apply
_をクリックしてPower BIレポートセクションに戻り、_Visualizations > Fields
_の下に新しいテーブルがあることを確認します。
これを取得するには、テーブルまたはマトリックスを挿入し、係数と変数をアクティブにします。
これがあなたが探していたものであることを願っています!
次に、Rスクリプトの詳細について説明します。
可能な限り、さまざまなRライブラリを使用することは避けます。これにより、依存関係の問題のリスクを軽減できます。
関数lm()
は、回帰分析を処理します。説明変数の数に関して必要な柔軟性を得る鍵は、_Manager ~ . , dataset
_の部分にあります。これは単に、データフレームManager
のdataset
変数に対して回帰分析を実行し、残りのすべての列_~ .
_を説明変数として使用することを示しています。 coef(model)
部分は、推定モデルから係数値を抽出します。結果は、行名として変数名を持つデータフレームです。最後の行は、これらの名前をデータフレーム自体に追加するだけです。
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の場合、出力をアップしてデータフレームを出力します 。
列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"""