Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4958 / 13644 ツリー ←次へ | 前へ→

【53349】回帰直線の傾きと切片を求めたい ごじら 08/1/4(金) 23:40 質問[未読]
【53350】Re:回帰直線の傾きと切片を求めたい ponpon 08/1/5(土) 0:09 発言[未読]
【53356】Re:回帰直線の傾きと切片を求めたい りん 08/1/5(土) 8:33 回答[未読]
【53357】Re:回帰直線の傾きと切片を求めたい(補足) りん 08/1/5(土) 9:15 発言[未読]
【53360】Re:回帰直線の傾きと切片を求めたい(補足) ごじら 08/1/5(土) 23:33 質問[未読]
【53368】Re:回帰直線の傾きと切片を求めたい(補足) りん 08/1/6(日) 12:22 回答[未読]
【53374】Re:回帰直線の傾きと切片を求めたい(補足) ごじら 08/1/6(日) 18:43 お礼[未読]

【53349】回帰直線の傾きと切片を求めたい
質問  ごじら  - 08/1/4(金) 23:40 -

引用なし
パスワード
   こんにちは。
エクセルマクロでワークシート上のデータから回帰直線の傾きと切片を求めたいと
思っています。

とりあえず傾きを求めようと、自分なりにやってみたのですが、うまくいきません。

Dim a as Double

a = WorksheetFunction.LinEst(Range("A1:A5"), Range("B1:B5"), True, False)

何かご教示いただければ幸いです。

【53350】Re:回帰直線の傾きと切片を求めたい
発言  ponpon  - 08/1/5(土) 0:09 -

引用なし
パスワード
   参考になれば

htt p://www.geocities.co.jp/Technopolis/2890/tool/Excel/regression.html

【53356】Re:回帰直線の傾きと切片を求めたい
回答  りん E-MAIL  - 08/1/5(土) 8:33 -

引用なし
パスワード
   おはようございます。

>エクセルマクロでワークシート上のデータから回帰直線の傾きと切片を求めたいと
思っています。
>a = WorksheetFunction.LinEst(Range("A1:A5"), Range("B1:B5"), True, False)

LINESTワークシート関数のヘルプによると、
 傾き: INDEX(LINEST(既知の y,既知の x),1)
 y切片:INDEX(LINEST(既知の y,既知の x),2)
ということなので、それをそのままVBAで表現すると、

Sub test()
  Dim rx As Range, ry As Range
  With Application.ActiveSheet
   Set rx = Range("B1:B5") 'X
   Set ry = Range("A1:A5") 'Y
  End With
  'INDEX、LINESTともにWorksheetFunctionで使用可能
  With Application.WorksheetFunction
   MsgBox .Index(.LinEst(ry, rx), 1), vbInformation, "傾き"
   MsgBox .Index(.LinEst(ry, rx), 2), vbInformation, "y切片"
  End With
  Set rx = Nothing: Set ry = Nothing
End Sub

こんな感じです。

【53357】Re:回帰直線の傾きと切片を求めたい(補...
発言  りん E-MAIL  - 08/1/5(土) 9:15 -

引用なし
パスワード
   さっきの補足というか、おまけというか。

>>エクセルマクロでワークシート上のデータから回帰直線の傾きと切片を求めたいと
>>思っています。
>>a = WorksheetFunction.LinEst(Range("A1:A5"), Range("B1:B5"), True, False)
>LINESTワークシート関数のヘルプによると、
> 傾き: INDEX(LINEST(既知の y,既知の x),1)
> y切片:INDEX(LINEST(既知の y,既知の x),2)
>ということなので、それをそのままVBAで表現すると・・・

下のようにLinEst関数の戻り値をVariant変数で受けると、INDEXは使わなくてもいいです。
Sub test()
  Dim rx As Range, ry As Range, dt As Variant
  With Application.ActiveSheet
   Set rx = Range("B1:B5") 'X
   Set ry = Range("A1:A5") 'Y
  End With
  'Variant(Array)で受け取る
  With Application.WorksheetFunction
   dt = .LinEst(ry, rx)
  End With
  '結果
  MsgBox dt(1), vbInformation, "傾き"
  MsgBox dt(2), vbInformation, "y切片"
  '
  Set rx = Nothing: Set ry = Nothing
End Sub

こんな感じです。

【53360】Re:回帰直線の傾きと切片を求めたい(補...
質問  ごじら  - 08/1/5(土) 23:33 -

引用なし
パスワード
   りんさん、丁寧なレスをいただき感謝いたします。
教えていただいたコードで単回帰分析はうまくいきました。
今度は係数を増やして、重回帰分析もやってみようと思ったのですが、
問題が出てきました。
dt配列(?)のインデックスが有効範囲内にないというのです。
dtはVariant型ということですが、配列として宣言していないので、大きさがよくわかりません。
↓が私のコードです。3つ目のMsgboxでエラーになります。
何かアドバイスをいただけると幸いです。よろしくお願いいたします。

Private Sub CommandButton1_Click()

Dim rx(3) As Range
Dim ry As Range
Dim dt As Variant

With Application.ActiveSheet
Set ry = Range(Cells(1, 1), Cells(5, 1)) 'Y
Set rx(1) = Range(Cells(1, 2), Cells(5, 2)) 'X1
Set rx(2) = Range(Cells(1, 3), Cells(5, 3)) 'X2
End With

With Application.WorksheetFunction
 dt = .LinEst(ry, rx(1), rx(2))
End With

MsgBox "x1 = " & dt(1)
MsgBox "x2 = " & dt(2)
MsgBox "切片 = " & dt(3) '''ここでエラーが出る

Set rx(1) = Nothing
Set rx(2) = Nothing
Set ry = Nothing

End Sub

【53368】Re:回帰直線の傾きと切片を求めたい(補...
回答  りん E-MAIL  - 08/1/6(日) 12:22 -

引用なし
パスワード
   ごじら さん、こんにちわ。

>今度は係数を増やして、重回帰分析もやってみようと思ったのですが、
>問題が出てきました。
>dt配列(?)のインデックスが有効範囲内にないというのです。
>dtはVariant型ということですが、配列として宣言していないので、大きさがよくわかりません。

>With Application.ActiveSheet
> Set ry = Range(Cells(1, 1), Cells(5, 1)) 'Y
> Set rx(1) = Range(Cells(1, 2), Cells(5, 2)) 'X1
> Set rx(2) = Range(Cells(1, 3), Cells(5, 3)) 'X2
>End With
>
>With Application.WorksheetFunction
> dt = .LinEst(ry, rx(1), rx(2))
>End With


こんどは重回帰という事で、もう一度LINESTのヘルプを見ると、

使用例 3  多変数の線形回帰
=LINEST(E2:E12,A2:D12,TRUE,TRUE)

という渡し方になっています。
なので、

Sub test()
  Dim rx As Range, ry As Range
  Dim dt As Variant
  With Application.ActiveSheet
   Set ry = .Range(.Cells(1, 1), .Cells(5, 1)) 'Y: A1:A5
   Set rx = .Range(.Cells(1, 2), .Cells(5, 3)) 'X: B1:C5
  End With
  '渡し方は同じ
  With Application.WorksheetFunction
   dt = .LinEst(ry, rx) '切片を0としない、補正項は考慮しない
  End With

  MsgBox "x1 = " & dt(2) '順番に注意。詳細はLINESTのヘルプを見てね。
  MsgBox "x2 = " & dt(1) '上に同じ。
  MsgBox "切片 = " & dt(3)
  Set rx = Nothing: Set ry = Nothing
  Erase dt
End Sub

こんな感じです。

【53374】Re:回帰直線の傾きと切片を求めたい(補...
お礼  ごじら  - 08/1/6(日) 18:43 -

引用なし
パスワード
   りんさん、ありがとうございます。うまくいきました。
引数の渡し方を勘違いしていました。
マクロからエクセルの関数を呼び出す場合にも、エクセルのヘルプが役立つことがわかりました。
今後ともよろしくお願いいたします。

4958 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free