🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

R

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2113閲覧

係数に制約をつけてfittingする方法

yumetodo

総合スコア5852

gnuplot

gnuplot(ニュープロット)は、2次元や3次元のグラフ作成ができるソフトウェアです。さまざまな数式やデータ集計などのグラフを描写することが可能で、特に2次元グラフを描画する機能は強力です。

R

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/07 06:41

sample

ExcelでもPythonでもRでもgnuplotでもまあツールはなんでも良いのですが、今3次式近似を行おうとしています。

図はExcelでやらした結果です。

ここで近似線は

y = ax^3+bx^2+cx+d

という式になっているわけですが、この式が(0,0), (1,1)を必ず通るように制約を書けたいのです。

つまり

d = 0 a + b + c = 1

という感じでしょうか。

制約なしでfittingする方法はいくらでも出てきますが、3次式近似に制約を掛ける例が見つけられませんでした。

上記のようなグラフと係数、R値を出す方法を教えて下さい。

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

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

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

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

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

guest

回答2

0

直接的な回答ではありませんがコメントします。

被説明変数がモル分率なので、被説明変数は0~1の範囲であると制約を解釈し直します。この説明変数は任意の実数(実際には0~1の範囲内)で被説明変数は0~1の範囲の実数を満たす関数にLogit関数があります。そこでこの関数を応用してモデル化すると要望に近い結果となる結果が得られると考えます。

ただし、Logit関数は右肩上がりのS字曲線を描くのでグラフのデータをy=x(グラフ上の実線)に対して線対称に変換する必要があります。

以上をまとめると以下のような処理を任意の言語(python,R)で実装すればいいでしょう。

1.元の説明変数と被説明変数の関係を行列式を用いてY=Xに対して線対称の値に変換する。
2.Logit関数を前提としてモデルパラメータを計算する。
3.理論値を取得し、改めてY=Xに対して線対称の値に変換する。

pythonの場合は以下のような感じになります。

def func1(x) : #### toy data 作成用関数 y = 3.89*x**3 - 5.56*x**2 + 2.65*x +0.013 + stats.norm.rvs(loc=0,scale=0.05,size=len(x)) return y x = np.linspace(0,1,11) y = func1(x) def reflection(x, m): #### y=mxに対して線対称の値に変換する関数 a = np.array([[1 - m**2, 2*m], [2*m, m**2 - 1]]) a = a / (1 + m**2) ax = a@x return ax x_translate = reflection(np.array([x,y]),1) #### Logitモデルのパラメータ推計(リンク関数はY=aX+bと仮定) import statsmodels.api as sm X = sm.add_constant(x_translate[0,:]) logit_model = sm.Logit(x_translate[1,:],X) result = logit_model.fit() #### 結果を再び変換 res = reflection(np.array([x_translate[0,:],result.predict()]),1)

投稿2019/12/08 17:46

R.Shigemori

総合スコア3376

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

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

yumetodo

2019/12/10 03:09

Logit関数について自分なりに調べたあとでBA決定します。
guest

0

y = ax^3+bx^2+(1-a-b)x=a(x^3-x) + b(x^2-x)+ x として最小二乗法。

投稿2019/12/07 07:09

編集2019/12/07 07:13
WathMorks

総合スコア1582

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

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

yumetodo

2019/12/10 03:06

そもそも式変形すれば一本の式にできることに頭が回ってなかったです。 実際に試してみてからBA決定します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問