質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

2回答

2400閲覧

for文で繰り返しlm関数を適応する。

KojiroYamamoto

総合スコア21

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2019/03/21 09:42

for文を使って繰り返しlm関数を適応させたいです。

例えばこのようなデータセットがあったとして、

r

1dat <- data.frame(outcome = rnorm(100), 2 a=rnorm(100), 3 b=rnorm(100), 4 c=rnorm(100))

これを変数a,b,cを説明変数、outcomeを目的変数とした単回帰分析を繰り返しで行う事とはできるのでしょうか?
イメージとしては、このようなことです。

r

1cols <- colnames(dat) 2for( col in cols[-1]){ 3 lm(data=dat,outcome~col) 4}

https://speakerdeck.com/yutannihilation/dplyrzai-ru-men-tidyevalbian

こちらの方法が近いかなと思ったのですが、私には理解できず...

他の方法でも構いませんので、ご教授頂けると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

一晩寝たら、あれ?できるんじゃないか?と思ったので書き込みます。

力技になりますがeval関数を使ってみてはいかがでしょうか。
文字列の部分が式として読み込まれる関数です。

R

1eval(parse(text="文字列"))

今回のケースでは以下のように使います。

R

1cols <- colnames(dat) 2for( col in cols[-1]){ 3 eval(parse(text=paste0("lm_",col," <- lm(data=dat,outcome~",col,")"))) 4}

for文内のlm()の結果は出力されないので、
とりあえず、変数 lm_a、lm_b、lm_cに格納しています。

R

1> lm_a 2 3Call: 4lm(formula = outcome ~ a, data = dat) 5 6Coefficients: 7(Intercept) a 8 -0.06024 -0.08546

投稿2019/03/22 02:19

fermat

総合スコア183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiroYamamoto

2019/03/22 12:11

ベクトルで与えた方が確かにスマートですね。 eval()を使った方法も勉強になりました。ありがとうございます!
guest

0

applyファミリーを使うのはいかがでしょうか。
lm()ってfor文が使えないんですかね(-"-)? ←コンソールに出力されないだけでした

R

1lapply(dat[-1], function(i){lm(dat$outcome~i)}) 2

投稿2019/03/21 10:52

編集2019/03/22 02:34
fermat

総合スコア183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiroYamamoto

2019/03/21 12:03

回答頂きありがとうございます。 いえ、繰り返しが問題ではなく、lm関数の中で変数に代入したものを使うとエラーが出てしまうことに困っております。 先の例ですと ```r cols <- colnames(dat) for( col in cols[-1]){ lm(data=dat,outcome~col) } ``` このcolという変数に列名が代入されているのですが、lm関数はそれをただの文字として認識しているため、エラーが出てしまうという状況です。 お手数をおかけしますが、よろしくお願い致します。
fermat

2019/03/21 14:12

lm関数の基本的な使い方は lm(ベクトルy~ベクトルx)です。 フォーミュラを挟む二つのベクトルが必要になるのですが、 lm(data=dat,outcome~col) これだとcolの部分が単なる列名"a","b","c"が代入されるだけで、 lm(ベクトルy~文字列)となってしまい良くないのでは?という印象です。 うむむ。力不足で考えられるのはここまででした。 すみません・・・(・・;)
KojiDoi

2019/03/21 15:07

fermatさんの方法で正しくできそうな気がするんですが、うまく行きませんか? colnamesにこだわる必要はないと思うのですが。
fermat

2019/03/22 02:19

あっDoiさん(`・ω・´)ゞ こちらもベクトルを引数にする方が簡明と思ったりしています~
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問