2017-12-23 33 views
0

この質問の文章が間違っていますが、ウェブを検索して時間がたっても私はこの質問に対して以前は答えられていないと思います。私は、この問題が何を伴うのかを詳しく説明するために最善を尽くします。複数の線形回帰(lm())の列名を動的に参照しています

データセットの概要: 使用されているデータは、Pythonコードから取得され、個々のCSVドキュメントに保存された財務データ(Open、High、Low、Close)です。 lapplyを使用して、文書を読み取り、保存しました。簡単にするために、私は現在、毎日のパーセンテージの変更、または(閉じる/シフト(閉じる)) - 1に焦点を当てています。この問題のために、私はデータからNAと完全ではないティッカーを削除しました。

私は1000列(日)にわたる98列(テロップ)のデータフレーム(リストから変換)を持っています。データフレーム/マトリックス内の値は、毎日、各ティッカーの毎日のパーセンテージの変更です。

目的: 私は他のすべての列(~ .)を使用して、動的に列名を参照して、各列の上にlm()式を適用する方法を知りたいです。

サンプルデータセット:

lm_aapl <- lm(AAPL ~ ., data=df) 

しかし、私は動的エラーに実行せずに、列名を参照する方法を見つけることができなかった:次の操作を行うために十分に簡単です

aapl_pct_chg <- c(.02, .03, .01, -.05, -.01) 
tmus_pct_chg <- c(-.01, -.02, .05, .01, -.03) 
akam_pct_chg <- c(.1, -.2, .3, -.03, -.07) 
intc_pct_chg <- c(.01, .03, .02, .01, .1) 
de_pct_chg <- c(-.01, -.05, .05, .1, -.03) 

df <- as.data.frame(cbind(aapl_pct_chg, tmus_pct_chg, akam_pct_chg, intc_pct_chg, de_pct_chg)) 

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 

。つまり、各列にlm()モデルをキャプチャする式を1つおきに実行することができ、それ以外の列を使用することができます。

いくつかの回答のある質問があります(私は謝罪していますが、私は組織化されておらず、500種類の方法でこれを試しています)が、それを解決したものはありません。私が一番近かったのは、私が望むことをする式ですが、AAPLを予測するときのAAPLの値が含まれます。これは良いモデルにつながりますが、私が望むものではありません。

答えて

0

あなたは残りのすべての変数を表すために、モデル式に.を使用することができますので、あなたは簡単に文字列として式のベクターを構築することができ、動的ステートメントを作成し、

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 
for (n in names(df)) { 
    code <- paste0("lm_", n , " <- lm(", n, " ~ ., data=df)") 
    eval(parse(text=code)) 
} 
+0

それは本当に悪いアイデアがしますコードをテキストとして格納します(したがって 'eval(parse(text = ...))')。言語を操作している場合でも、式や他の言語オブジェクトを扱うほうが普通です。 – alistaire

+0

@alistaire私は同意しますが、それは私が思いついたものです。 –

1

それを解釈するためにeval()parse()を使用することができますpasteとなります。通常の次のステップは、文字列にまたはそれに類するものを反復し、as.formula(ベクトル化されていない)を呼び出してから式を適用することです。すべて一緒に、

df <- data.frame(AAPL = c(0.02, 0.03, 0.01, -0.05, -0.01), 
       TMUS = c(-0.01, -0.02, 0.05, 0.01, -0.03), 
       AKAM = c(0.1, -0.2, 0.3, -0.03, -0.07), 
       INTC = c(0.01, 0.03, 0.02, 0.01, 0.1), 
       DE = c(-0.01, -0.05, 0.05, 0.1, -0.03)) 

models <- lapply(paste(names(df), '~ .'), 
       function(f){ lm(as.formula(f), data = df) }) 

models[[1]] 
#> 
#> Call: 
#> lm(formula = as.formula(f), data = df) 
#> 
#> Coefficients: 
#> (Intercept)   TMUS   AKAM   INTC   DE 
#>  0.01941  0.52529  0.02116  -0.33372  -0.70687 

(注)式でスプライスしたい場合は、使用して呼び出しは、非常にきれいではありませんsubstituteeval得られた発現:

models <- lapply(paste(names(df), '~ .'), function(f){ 
    eval(substitute(lm(frm, data = df), 
        list(frm = as.formula(f)))) 
}) 

models[[2]] 
#> 
#> Call: 
#> lm(formula = TMUS ~ ., data = df) 
#> 
#> Coefficients: 
#> (Intercept)   AAPL   AKAM   INTC   DE 
#> -0.03694  1.90370  -0.04028  0.63530  1.34566 
+0

これは完璧に働いた、ありがとう。将来の参考として、フィットした値や係数などを保存することをどのようにお勧めしますか?コードを簡潔に保ちながらアクセシビリティを強化する?あなたの助けを歓迎します – ThatsMrLongCut

+0

あなたは好きなだけ匿名関数の中でそれらを抽出できますが、通常は後で必要なものを選ぶことができるようにモデルのリストを保存するのが最善です。 '' lapply(models、broom :: tidy) ''と '' lapply(models、broom :: glance) ''または '' lapply(models、coef) '' – alistaire