餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

R言語

Rでlmコマンドの結果からStd. Errorを取得する

たまに回帰分析の係数の区間推定を求めたいときがあります。 lmコマンドの推定結果から標準誤差(Std. Error)を取得するときは、以下のようにすると簡単です。 r <- lm(expression) # expressionは任意の推定式です coef(summary(r))[, 2] 例えば3番目の係…

Rで解くFizzBuzz問題

前のエントリーでFizzBuzz問題がもっと速くなるのでは無いかと指摘したら、“エレガントではないけどと速いコード”を書いて頂けたので、他のコードとあわせて紹介したいと思います。遅い順に合計7種類。 1. @kos59125 氏 Type I @kos59125 氏が説明用に示した…

Rのベクター処理にバグ? - ではありませんでした

FizzBuzz問題を解いていて気付いたのですが、Rにバグがあるかも知れません。と思ったら、無かったです。 ちょっと紛らわしいコードを書きます。ベクターに添字をすることで、ベクターの一部分の文字列を取得しているのですが、1から11まで一度に計算したとき…

RでFizzBuzz問題を高速化

「裏 RjpWiki」で「R らしく FizzBuzz」と言うエントリーがあるのですが、ワンライナーですっきりしていますが、速度的にちょっと彼らしくない書き方になっています。 ifelse()を減らせば、もっと速度が改善しますよ。手元の計測では裏 RjpWiki版が4.96秒、i…

Rで解いていないFizzBuzz問題

「Rで解くFizzBuzz問題」を見ていて理解できる事は、Rで高速なコードを書くのはトリッキーだと言う事ですね。素直にCで実装した方が速いかも知れないと言うことで、試してみました。 速度的には、Rで最も速かった「裏 RjpWiki 変態チック版」の約1.5倍という…

「Rと手作業で覚える最尤法」のコードに関して補足

どうもコメント欄で粗雑なコードで御迷惑をおかけしましたと書いたら、『裏 RjpWiki』と言うブログで「Rと手作業で覚える最尤法」に関して、『ある意味「えれがんと」だなあ』と皮肉を言われています(ダメ出し:簡明直截なプログラムを書こう)。ダメ出しを…

M-Hアルゴリズムによるポアソン分布推定コードのチューニング

「Rでマルコフ連鎖モンテカルロ法を試す」で書いたMCMCのコードが、NR法による最尤推定とのつながりで混乱していたせいか、それをチューニングしようと言うエントリーが出てしまったので、ちょっと補足をします。 以前のエントリーでは対数尤度関数を使って…

-1*f()より-f()

Rで「-1*f()が気持ち悪い」と言う指摘を受けて、-f()だとSyntax errorになりそうで逆に気持ち悪いんじゃないかと思っていたら、年寄りの戯言でした。 どういう事かと言うと、この二つがRではS式が異なるわけです。 f <- function(n){ n + 1 } as.list(quote(…

加算後の除算≿除算後の加算

かなり大量に演算しないと目立ちませんが、500万サンプルで比較すると、0.10秒と0.16秒で差が計測できました。 obs <- 5000000 x <- runif(obs) y <- runif(obs) ### まとめて割り算 ### gc();gc() system.time({ n <- x + y m <- n / 2 print(sum(m)) }) ##…

Rは行列演算≿apply関数≿ループ演算

Rのプロビット回帰を用いたマイクロ・ベンチマークを書いたので、ソースコードを公開しておきます。 1. セットアップ 推定結果が常に同じになるように、セットアップします。 ### セットアップ ### set.seed(20120209) obs crt x1 x2 y frml # 説明変数を行…

ifelse()と論理値の掛け算

Rでは論理値TRUEとFALSEは、それぞれ1と0として演算する事ができます。ゆえにyとzがxの値に関わらず計算可能な値になるのであれば、ifelse()の代わりに論理値で演算を行う事ができます。 ifelse()はベクター演算にならないので、論理値を使う方が速いです。…

配列の拡張とパフォーマンス

動的に配列サイズが変更されるほど、パフォーマンスは劣化します。 num = 50000### 配列を拡張していく ### gc(); gc() system.time({ x <- numeric(0) i <- 1 while(i <= num){ x[i] <- i i <- i + 1 } })### 配列を一度に初期化 ### gc(); gc() system.tim…

Rでトービット・モデルによる打ち切りデータの推定

金額で測った不動産の保有量を考えましょう。大半の貧乏人はゼロでありますが、一定以上の所得がある人から保有量が増加してきます。集合住宅、持ち家、そして別荘や投資物件など増加していくわけです。 こういう説明変数の値に対して、一定まではゼロ(もし…

地獄のミサワ的Rユーザーのソースコード

別のブログでアイナちゃんの課題をミサワ君とサエコ先輩が助ける話を書いたのですが、検証用にその物語中のソースコードを公開しておきます。 1. データセットの作成 データセットは課題で出されたモノになりますが、ファイルを用意するのも面倒なので、今回…

Rでマルコフ連鎖モンテカルロ法を試す

地味にここ5年間ぐらい、マルコフ連鎖モンテカルロ法(MCMC)が流行っているようです。汎用的な分布でベイズ推定を行う時に有用な数値解析アルゴリズムの総称で、Metropolis-Hastings algorithm(M-Hアルゴリズム)などが主要なメソッドとして使われています…

Rによる数値微分

Rはderiv()関数で記号/微分ができるものの、和や積、つまりsum()やprod()があると微分できません。以下のようなコードを実行すると、『関数 'sum' は導関数の表中にありません』のようにエラーメッセージが出ます。 # ベクトルxを代入 x # 変数bを2とする b …

Rと手作業で覚える最尤法

OLSより進んだ統計手法で最初に覚えるのは最尤法だと思います。大半の人はツールとして知っていて、あまり中身を意識していない気がするのですが、「尤度」の説明無しで『尤度が最大になるパラメーターを求める方法』と言う説明が横行しているのは、問題があ…

Rでニュートン・ラフソン法

文系の学生などで特に目的無くプログラミングを覚えたい人には、Rが最適です。統計解析に使わなくても、ちょっと計算した気になるプログラミングの練習をしてみましょう。 1. よくある近似解を求める 関数f(x)=0があるとして、テーラー展開をしてみます。f(x…

Rで年次ダミーを作成

実際の計量分析ではダミー変数は無くてはならないテクニックで、技術進歩の計測でもしない限りは、複数年にまたがるデータには年次ダミーが含まれている事が通例です。Rでは簡単にダミー変数を作る事ができます。 例えば以下のようなデータフレームdfがある…

Rでデータフレームに、t-1期のデータを追加する(ミクロデータ向き)

被説明変数が説明変数に影響を与えている事を同時性と言います。アイドルのCMやドラマ露出時間と、アイドルの人気度の関係などが例にあげられるでしょう。単回帰では問題ないのですが、重回帰分析では分析に深刻な影響を及ぼす可能性があります。 これを解決…

Rでバランスド・データの作り方

複数年に渡るミクロデータでは、個体が入ったり抜けたりします。例えば地域住人のデータでは、転居や死亡などで個体が減りますし、逆に転入や誕生で個体が増えたりします。サンプル数が膨大な場合は誤差になりますが、限定されたサンプルでは推定結果に影響…

Rでミクロデータにマクロデータを紐付ける

ミクロデータへのマクロデータへの紐付けはデータ分析では良くある作業です。例えば企業の財務データを、その年のインフレ率で割り引く作業があります。Rの演算は各年各企業のデータにインフレ率が無いと演算しにくいので、Excelのvlookup関数で紐付けを済ま…

今日は第何週?

R言語は、他の人気スクリプト言語に比較すると、ベクトル演算以外は記述が煩雑な気がします。特に日付関係は特殊なオブジェクトが乱立しており、少なくとも他の言語とは扱い方がちょっと違います。 例えば、今日が第何週かを調べるには以下のようにすれば良…