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

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

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

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

Q&A

解決済

2回答

3650閲覧

Rで2式の交点を求める

funyo

総合スコア0

R

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

0グッド

1クリップ

投稿2020/08/28 02:25

#Rで求めた2つの回帰曲線との交点座標を求めたいです。

以下のようなcsvファイルデータから左と回答する確率(ans_left)と、右と回答する確率(ans_right)を、degを説明変数とするロジスティック回帰を求めました。
そこでそれら回帰曲線らの交点を求めたいです。

csv

1 imagename ans_left ans_direct ans_right direction deg 20 any_0_+20 0 0 1 0 20 31 any_0_-15 1 0 0 0 -15 42 any_+30_-5 0 1 0 30 -5 5...
  • ans_left:左と回答したかどうか(0 or 1)←従属変数
  • ans_right:右と回答したかどうか(0 or 1)←従属変数
  • deg: 角度(-20~20) ←説明変数

イメージ説明

  • 赤曲線:glm()で求めたロジスティック回帰曲線1
  • 緑曲線:glm()で求めたロジスティック回帰曲線2
  • 青曲線: 1- 赤曲線 - 緑曲線

求めたいこと

  • 赤曲線と青曲線の交点座標
  • 緑曲線と青曲線の交点座標
  • 青曲線の最大値とその座標

現在のコード

曲線をプロットすることは出来ましたが、交点座標の求め方がわかりません。

R

1HEAD_L = -30 2HEAD_D = 0 3HEAD_R = 30 4 5# plotする図のx軸(deg)の上下限 # 6xMin = -30 # x軸の下限 7xMax = +30 # x軸の上限 8 9 10# データの読み込み # 11df_long <- read.csv('log/gomi.csv',header=T) # 1列目(header)=列名(True) 12df_short <- read.csv('log/0826_2/0826_2_short.csv',header=T) 13 14# 関数宣言 # 15f_ansL <- function(ansData){ #ansData:列名"direction"の値=-30の行の、列3("ans_left"), 7("deg")のデータ 16 ans <- glm(ans_left~deg, data = ansData, family=binomial(logit)) 17 summary(ans) # 要約 18 return (ans) 19} 20 21f_ansR <- function(ansData){ #ansData:列名"direction"の値=-30の行の、列3("ans_left"), 7("deg")のデータ 22 ans <- glm(ans_right~deg, data = ansData, family=binomial(logit)) 23 summary(ans) # 要約 24 return (ans) 25} 26 27long_headL_ansL_data <- df_long[df_long$direction== HEAD_L, c(3,7)] # 列名"direction"の値=-30の行の、列3("ans_left"), 7("deg")の値を取得 # 列の値が条件を満たす行データだけ抽出 28long_headL_ansL = f_ansL(long_headL_ansL_data) 29 30long_headL_ansR_data <- df_long[df_long$direction== HEAD_L, c(5,7)] # 列名"direction"の値=-30の行の、列3("ans_left"), 7("deg")の値を取得 31long_headL_ansR = f_ansR(long_headL_ansR_data) 32 33 34 35y <- tapply(long_headL_ansL_data$ans_left, long_headL_ansL_data$deg, mean) 36x <- names(y) 37points(x, y,col=2) 38 39par(new = TRUE) # 図の重ね合わせを許可 40 41y_long_headL_ansR <- predict(long_headL_ansR, data.frame(deg), type = "response") 42plot(deg, y_long_headL_ansR, type = "l", xlim = c(xMin, xMax), ylim = c(0, 1), ann = F , col = 3) 43 44 45deg <- seq(xMin, xMax, length = 100) 46 47y_long_headL_ansL <- predict(long_headL_ansL, data.frame(deg), type = "response") 48png("logisticGlm0000.png") 49plot(deg, y_long_headL_ansL, type = "l", xlim = c(xMin, xMax), ylim = c(0, 1), xlab="direcion of gaze[deg]", ylab="Prop. of resposes", col = 2) 50 51 52y <- tapply(long_headL_ansR_data$ans_right, long_headL_ansR_data$deg, mean) 53x <- names(y) 54points(x, y,col=3) 55par(new = TRUE) # 図の重ね合わせを許可 56plot(deg, 1- y_long_headL_ansL - y_long_headL_ansR, type = "l", xlim = c(xMin, xMax), ylim = c(0, 1), ann = F , col = 4)

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

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

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

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

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

guest

回答2

0

自己解決

結局Rでの解き方がイマイチわからず...
Pythonに連立方程式の解を求めるfsolve関数というものがあり、リファレンスや記事も充実していたことから、Rで回帰式導出→pythonで交点導出で一旦解決しました。
(これならいっそ回帰式導出もPythonで再実装すべきかなと思ったり.....)

11.scipyの基本と応用
こちらのサイトのexampele-02を参考にさせて頂きました。
↑こちらでは交点が2つある場合の求め方と、グラフへのプロットまで丁寧に記述されていました!

私が求たいのは一点の交点だけだったので、必要な部分だけ真似してコーディングさせて頂きました。

式1と式2の1交点を求める

python

1import numpy as np 2import matplotlib.pyplot as plt 3from scipy.optimize import fsolve 4 5 6 7x = np.linspace(-20, 20, 1000) # -20~20に10000の要素を持つ等差数列を生成 8def func(p): 9 x, y = p[0], p[1] 10 f = np.zeros(2) # 0を初期値とする2要素の配列を生成 11 f[0] =1 # y = 3x + 1 のときは 3*x + 1 - y と記述 12 f[1] =2 13 return f 14 15o1 = fsolve(func, [1, 1]) 16o1[0] # 交点のx座標 17o1[1] # 交点のy座標

ちなみに
Pythonで方程式を解く方法(SciPy、ニュートン法、二分法による計算)
によると方程式を解く方法も複数あるようです。
ニュートン法や二分法の方が解導出が早いようですが、今回は大した計算ではないし、処理速度は気にしていなかったので実装が一番手軽なSciPyによる計算を行いました。

投稿2020/09/02 04:12

funyo

総合スコア0

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

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

0

解析的に求めたいのでしょうか?数値的に求めたいのでしょうか
1/(1+exp(-ax_1+b)) = 1/(1+exp(-cx_2+d)なので解析的にも求められるかと思います

数値的にでればx-yの座標がありますので、ループしてyの値がイコールか微小な一定範囲内となるxの値を出せばよいかと思います。

投稿2020/08/28 03:49

aokikenichi

総合スコア2240

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

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

funyo

2020/08/28 06:07

回答ありがとうございます。 導出された回帰式をもとにrプログラムで解析的に求める場合は、関数nleqslvを用いて求めるということでしょうか? (rの関数に関して知識が浅いため稚拙な質問で申し訳ありません。間違いや他に推奨される関数があれば教えていただきたいです。)
aokikenichi

2020/08/28 09:22

いえ、プログラムでなくて手計算でもよろしいかと。 大量にあるとのことでしょうか?
funyo

2020/08/28 09:36

確かに手計算でも可能ですね。 ただ、いくつか同じ解析を行うのでプログラム内で自動化出来たらベストです。
aokikenichi

2020/08/28 09:43

私は、nleqslvほかRで数式解析をしたことがないので、申し訳ないですが分かりません。 私であれば数値で行きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問