LuaTeXで単回帰の係数を計算して本文に埋め込んだ
最近、業務で単回帰に関連した問題を作った。データと推定式を与えて、
- 残差二乗和の式
- 式の簡単な解釈を書かせる問題
の2つを書かせる問題である。この問題を作ろうとすると、データと回帰式の両方を問題文に書く必要がある。
業務では、与えたデータをRのlm関数に計算させて得た回帰係数を問題文に書いた。しかし、このようなコピペ作業は間違いが起こりやすい。単回帰の計算程度であれば、全てTeXの中で完結させたいと考えるのは自然な欲求である。
以下が問題のイメージ(設問は関係ないので略。書き方にツッコミは入れないでほしい。)。
ソースは次の通り。
まずluaの部分から。これを以下のtexの\begin{luacode}以下に挟む。上品でない関数名や変数名は見なかったことにしてほしい。 (luaのシンタックスハイライトを使うためにブロックをわけた)
--http://www.geocities.jp/m_hiroi/light/lua02.html sumを引用 function sum(ary) local total = 0 for i = 1, #ary do total = total + ary[i] end return total end function mean(ary) return sum(ary) / #ary end function xysum(ary1,ary2) xy = {} meanx = mean(ary1) meany = mean(ary2) for i=1, #ary1 do xy[i] = (ary1[i] - meanx )* (ary2[i] - meany) end return sum(xy) end function f(ary1,ary2) --回帰式の出力 meanx = mean(ary1) meany = mean(ary2) bunbo = xysum(ary1,ary1) bunshi = xysum(ary1,ary2) --係数の計算 hatb = bunshi/bunbo hata = meany - (bunshi/bunbo)*meanx --出力 tex.print(hatb .. "x+" .. hata) end function output_tblrow(ary) --表の行出力 for i=1, #ary -1 do tex.print(ary[i]) tex.print("&") end tex.print(ary[#ary]) end
TeXの部分のコード。
\documentclass{ltjsarticle} \usepackage{luacode} \begin{luacode*} %%上のluaのコードが入る \end{luacode*} \begin{document} ある店の付近の温度と自動販売機の売り上げの関係について考える。以下のようなデータが得られたものとする。 %%データの配列を与える。 \def\datx{25,27,29,31,33} \def\daty{70,73,77,78,80} %% \begin{center} \begin{tabular}{lccccc} \hline 温度 & \luaexec{output_tblrow({\datx})} \\ \hline 売り上げ & \luaexec{output_tblrow({\daty})} \\ \hline \end{tabular} \end{center} 最小二乗法によって$y=ax+b$の関係式を推定したところ($y$は売り上げ・$x$は温度)次のような関係が推定できた。 \[ y = \luaexec{f({\datx },{\daty })} \]
tabularの設定のlcccccも自動で出したかったが、なぜかうまくいかなかった。luaexecでlcccccの文字列を返す関数を書いたが、エラーを履いた。今後の課題である。