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

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

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

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

ggplot2

ggplot2は、統計解析向けのプログラミング言語及びその開発実行環境であるR言語のグラフィック作成用のライブラリです。

R

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

0回答

849閲覧

説明変数を3つ以上含む回帰分析の視覚化ができません

2929porno

総合スコア1

RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

ggplot2

ggplot2は、統計解析向けのプログラミング言語及びその開発実行環境であるR言語のグラフィック作成用のライブラリです。

R

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

1クリップ

投稿2021/04/25 11:36

編集2021/04/25 11:40

前提・実現したいこと

tidyverseパッケージを使って、説明変数を3つ以上を含む回帰モデルの視覚化を試みています。
複雑になるのを避けるため、irisデータで試しています。
具体的には重回帰分析の結果を以下のように表現したいと思っています。

  1. 番号リスト被説明変数(Sepal.Length)は、y軸にplot、
  2. 番号リスト説明変数①(Sepal.Width)はx軸にplot、
  3. 番号リスト説明変数②(Petal.Length)は調整変数とみなして、図示しない
  4. 番号リスト説明変数③(Species)はcolor=で指定して表現
  5. 番号リスト重回帰分析の結果であるpred(add_predictions()で生成)を用いて直線を引く

発生している問題・エラーメッセージ

上記のイメージでコードを作成したところ、図のようになってしまいます。
この問題について原因と解決策を御存じであれば御教示いただけますと幸いです。
イメージ説明

該当のソースコード

R

1iris_lm <- lm(Sepal.Length ~ Sepal.Width+ Petal.Length+ Species, data = iris) 2iris_pred <- 3 data_grid(data = iris, Sepal.Width, Petal.Length, Species)%>% 4 add_predictions(iris_lm) 5ggplot(iris,aes(x=Sepal.Width))+ 6 geom_point(aes(y=Sepal.Length,color=Species))+ 7 geom_line(data=iris_pred,aes(y=pred,color=Species))

試したこと

説明変数を2つ(回帰式で表現するならば、y~α+β₁x₁+β₂x₂)にした際には、
下記のコードで思い通りの作図ができました。
2つ目の変数はcolor=で指定することでグラフ内で表現しています。

R

1iris_lm1 <- lm(Sepal.Length ~ Sepal.Width + Species, data = iris) 2iris_pred1 <- 3 data_grid(iris, Sepal.Width, Species)%>% 4 add_predictions(iris_lm1) 5ggplot(iris,aes(x=Sepal.Width, y= Sepal.Length))+ 6 geom_point(aes(color=Species, shape = Species),alpha=0.8)+ 7 geom_line(data= iris_pred1, aes(y=pred,color=Species)) 8

イメージ説明
上記コードはgeom_line()geom_smooth()にしてformulaを記載する方法でも実現可能だと思います。しかし、その際説明変数を3つにするとformula = y ~ x + z(?)とするほかなく、ggplotでの表現ができないように思います。

補足情報(FW/ツールのバージョンなど)

Rstudioで作成しています
『社会科学のためのデータ分析入門(上)』という本をもとにRを勉強しています。
教材の中では「不均一トリートメント効果(Heterogeneous Treatment Effects)」を検証するための方法として、回帰分析の結果をpredit()関数を使って視覚化しています。
今回は、そのやり方をもとにtidyverseやmodelrパッケージを使い、data.frame()を、data_grid()に、predict()をadd_prediction()に置き換えるなどして、上記書籍の練習問題を解いていたところ、質問をしております課題に直面し行き詰ってしまいました。
具体的には第4章の練習問題メキシコにおける選挙と条件付き現金給付プログラムの問題です。

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

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

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

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

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

aokikenichi

2021/05/01 07:56

5. は何の直線を引きたいのでしょうか
2929porno

2021/05/01 13:05

ご質問ありがとうございます。説明不足で恐縮です。 5.ではSepal.Width、Petal.Length、Speciesの3つの変数で重回帰をして算出した予測値(iris_pred$pred)で直線を引こうと思っています。 簡単に言えば、 ggplot(iris,aes(x=Sepal.Width))+ geom_point(aes(y=Sepal.Length,color=Species))で描いたグラフに、 x軸にiris_pred$Sepal.Widthを、y軸にiris_pred$predの数値をplotして直線を引く、ということを考えています。 説明変数を3つで算出した予測値(iris_pred$pred)は、説明変数2つで算出した予測値(iris_pred1$pred)と比べて、追加した変数であるPetal.Lengthで調整がされている分異なっていることから、説明変数2つで算出した(iris_pred1)を描いた直線とは違う直線が描けるはずだという考えのもと上記コードを作成しています。 また、説明変数が2つの場合、geom_smooth((method="lm",formula='y~x',aes(color=))のようにすれば、add_predictions()で算出したものとほぼ同じグラフが得られるかと思いますが、 geom_smoothの場合、説明変数が3つになると表現する術を持たないと思い、add_predictions()を使い算出した予測値を用いてグラフに直線を図示することを試みています。 用語の使い方など、間違っているかもしれません。もし不明な点があれば追加で補足させていただければ幸いです。
aokikenichi

2021/08/13 10:05

すみません大幅に回答が遅れました x軸のSepal.Widthに対し、Petal.Lengthの異なった値が複数あり、Predも異なった値が複数あるので、それをそのまま直線で引くと図示いただいた通りになるのが正解ではないでしょうか? 「説明変数2つで算出した(iris_pred1)を描いた直線とは違う直線が描けるはず」 はおっしゃる通りと思いますが。 どういう直線をイメージされているのでしょうか。
2929porno

2021/08/14 23:56

ご回答ありがとうございます。 おっしゃる通り、x軸のSepal.Widthに対し、Petal.Lengthの異なった値が複数あり、Predも異なった値が複数あるので、それをそのまま直線で引くと図示いただいた通りになる、ということがやっと理解できました…。 大変助かりました。 もともとイメージしていたのは、重回帰分析の結果をPetal.Lengthを一定にして直線で図示することを考えていたようです。 自分の頭の整理ができておらず恐縮です。 以下はSpeciesごとのPetal.Lengthの平均値を固定の値として指定し、直線になるようにしてみました。 この直線が説明変数2つで算出した(iris_pred1)を描いた直線と違う直線になるのは、説明変数を3つにした(Petal.Lengthを変数として追加した)影響なのだと理解しています。 > tapply(iris$Petal.Length, iris$Species, mean) setosa versicolor virginica 1.462 4.260 5.552 > iris_pred <- + data_grid(data = iris, Sepal.Width, Species)%>% + mutate(Petal.Length = ifelse(Species == "setosa",1.462, + ifelse(Species == "versicolor",4.260,5.552))) %>% + add_predictions(iris_lm)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問