[[20110309154823]] 『グラフの近似曲線の係数を取得するには』(コロちゃん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『グラフの近似曲線の係数を取得するには』(コロちゃん)
Excelグラフにおいて、近似曲線を画かせ、数式とR2を表示させました。
続けて、近似曲線の値と実数の差を計算させるなど、次のステップへと繋げたい
と考えています。グラフ上から読み取ればいいのかも知れませんが、
マクロで取得したいのです。
よろしくお願いします。
VISTA、Office2007です。

 こんな感じで取得できると思います。

  Sub test()
  Dim buf As Variant
  buf = Split(ActiveSheet.ChartObjects("グラフ 1").Chart _
              .SeriesCollection(1).Trendlines(1).DataLabel.Text, vbLf)
  MsgBox buf(0) & vbLf & buf(1)
  End Sub


 ここまでした方が解るかな?

  Sub test()
  Dim buf As Variant, a As Double, b As Double, R2 As Double
  buf = Split(ActiveSheet.ChartObjects("グラフ 7").Chart _
              .SeriesCollection(1).Trendlines(1).DataLabel.Text, vbLf)

  a = CDbl(Replace(Split(buf(0), " ")(2), "x", ""))
  b = CDbl(Split(buf(0), " ")(4))
  R2 = CDbl(Split(buf(1), " ")(2))

  MsgBox buf(0) & vbLf & _
         buf(1) & vbLf & vbLf & _
         "y=ax+b" & vbLf & _
         "a=" & a & vbLf & _
         "b=" & b & vbLf & _
         "R2=" & R2
  End Sub

 でも、傾きと切片ならSLOPE関数とINTERCEPT関数でも割り出せますけど・・・
 (momo)

(momo)さん

早速、ご指導有難うございます。
VBに関しては、Excelマクロで一般的に使う範囲しか勉強していませんので、お尋ねしたところです。
上部の方法は、うまくメッセージとして、表示されました。
実際には、下部で示していただいた方法のほうが、それぞれの係数が取得できるので、助かります。
ただ、実施してみますと、a=の行で、タイプエラーとなりました。
ーー
ついでに、と云っては失礼になりますが、@指数曲線近似の場合、A二次関数曲線の場合も教えていただければ幸いです。よろしくお願いします。
(コロちゃん)より


 >指数曲線近似の場合、A二次関数曲線の場合も教えていただければ幸いです。

 こちらのwebsiteが参考になると思います。
 E97M054  散布図の近似曲線で式の係数を得る
 http://www2.aqua-r.tepm.jp/~kmado/kvba.htm
 (shin) 

 であれば
 buf = ActiveSheet.ChartObjects("グラフ 7").Chart _
              .SeriesCollection(1).Trendlines(1).DataLabel.Text

 だけにして、変数bufの中身を見てご自身でどのように数値を抜きとるか考えてみましょう。
 (momo)


 正規表現で取り出す場合の参考例を載せておきます。

  Sub test()
  Dim buf As String, myStr As String
  Dim myC As New Collection, c As Variant

  buf = ActiveSheet.ChartObjects("グラフ 1").Chart _
              .SeriesCollection(1).Trendlines(1).DataLabel.Text

  With CreateObject("VBScript.RegExp")
    .Pattern = "[^x][-\d.]+"
    .Global = True
    For Each c In .Execute(buf)
      myC.Add c.Value
    Next c
  End With
  For i = 1 To myC.Count
    myStr = myStr & vbLf & myC.Item(i)
  Next i
  MsgBox Mid$(myStr, 2)
  End Sub

 (momo)

(momo)さん、 (shin)さん

ご指導有難うございました。お陰様で、うまく関数を取得できるようになりました。
ただし、指数曲線近似の場面で、例えばy=4E+8e-0.101xという結果になったとき、
実際は、y=3.556783E+8e-0.101というように精度に問題が生じました。
LN関数で指数化し、一次関数として、SLOPE関数、INTERCEPT関数を使って係数を求め、
さらにEXP関数を使って、解を求めることにしました。
余りスマートな方法ではないかもしれませんが、1200件ほどの散布図グラフの分析を
短時間で確実に実施することができるようになりました。
このメモが、お目に留まる機会があるかどうか判りませんが、深く感謝しています。
有難うございました。(コロちゃん)


 ちゃんと見てますよ〜
 参考になる場面は少なかったかもしれませんが
 出来たようで良かったです^^
 (momo)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.