LuaTeXで単回帰の係数を計算して本文に埋め込んだ

最近、業務で単回帰に関連した問題を作った。データと推定式を与えて、

  1. 残差二乗和の式
  2. 式の簡単な解釈を書かせる問題

の2つを書かせる問題である。この問題を作ろうとすると、データと回帰式の両方を問題文に書く必要がある。

業務では、与えたデータをRのlm関数に計算させて得た回帰係数を問題文に書いた。しかし、このようなコピペ作業は間違いが起こりやすい。単回帰の計算程度であれば、全てTeXの中で完結させたいと考えるのは自然な欲求である。

以下が問題のイメージ(設問は関係ないので略。書き方にツッコミは入れないでほしい。)。

f:id:baruku07:20180212023536p:plain

ソースは次の通り。

まず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の文字列を返す関数を書いたが、エラーを履いた。今後の課題である。

lua有理数を簡単に扱えるのであれば、もう少し色々な問題でこんな遊びができそうな気がするのだが。。。