Rコマンドの基本

1. 利用するパッケージのインストールと読み込みはスクリプトの最初に記載。

2. 一度インストールするとそのPCにはパッケージが入っているので,以後インストールする必要が無いため、#を付けて、次回から読まないようにする。ただし、学校のPCを使う場合は、毎回初期化されるのでインストールする必要があります

#install.packages(“readxl”)

#install.packages(“modelsummary”)

3. Rを実行するときは,立ち上げ後library()を行う。パッケージの取り外しはdetach(“package:パッケージ名”)を実行。ただし、再インストールは不要。

library(readxl)

library(modelsummary)

4. 実行する一連のコマンドには#をつけて、作業内容が後で分かるようにしましょう。

#駅データの最寄り駅を持っている地点と距離や時間を結合する

stationdata <- read_excel(“駅データ.xlsx”, sheet = “距離・時間”)

koujitika<- merge(koujitika111, stationdata, by=“最寄り駅”, all=T)

Rstudioの開始時の終了時の注意点

1. 必ず、作業用フォルダーを指定する。トップメニューのToolsGlobal OptionsGeneralをクリックすると下記のwindowが表示されます。 そこで、Default working directoryBrowseをクリックして、作成した作業フォルダーを指定。大学のPCルームのPCではN:フォルダーが使えないので、他のフォルダー(C:等)を作ってください。

2. 新規の作業の場合は、FileNew FileR scriptでスクリプトを立ち上げるとUntitledというファイル名になります。ファイル名は以下のように変更できます。

- R studioのFileSave asファイル名の変更します。ファイル名は必ず変更しておいてください。

3. criptのsaveは様々な方法があります。上記は一例ですが、作業終了後にツールバーの右上の×をクリックすると、下図のようなwindowが現れます。ここで、checkすると、そのfileが更新されます。作業スペースとはそのときのR作業環境とユーザ定義のオブジェクトを含めたもので、次にRを起動したときに自動的に読み込まれます。データ更新するとデータも更新するか聞いてきます。全部saveすることをお薦めします。

4. 初期設定で文字化けする場合。文字エンコードを間違って変えた人は下記を実行してください。 RstudioのToolGrobal Options...CodeSavingSerializationDefault text encodingで「UTF-8」を指定

Rの関数に関する注意点

1. Rでは簡単な関数は実装されていてそのまま使うことができます。やや複雑な場合は数式をプログラムに変換して関数を作った方が便利です。

2. 例えば、簡単にxとyの和の関数をtasuとして、以下のように定義します。すると、tasu(30,20)を実行すると50となります。callは後ほど使う時に説明します。

tasu<-function(x, y) 
  x+y
tasu(30,20)
## [1] 50

変数名を一括で変換する方法

1. 変数名を一括で変える方法が分かりました。国土数値情報などからデータを入試した場合に有用です。Excelで1行目に元の変数名、2行目に更新したい変数名を入れた下記のようなファイルを作ります。

2. 変数変換の一括コマンドは下記です。

varname_lp <- read_excel(“上記のファイル名.xlsx”, sheet = “シート名”)

colnames(変えるデータオブジェクト名)<-varname_lp

1 ダミー変数の導入(復習)

  • 定数項ダミー
# JR横浜線の場合は下記の通りです。これを検討対象の3路線で作成してください。
#koujitika$d_JR横浜線 <- ifelse(koujitika$路線=="JR横浜線",1,0)
# 複数の条件でダミー変数を作る(2つ条件をすべて含むときは"|"を入れる(例;商業系))
#koujitika$d_商業系 <- ifelse(koujitika$用途区分=="近商" | koujitika$用途区分=="商業",1,0)
# 複数の条件でダミー変数を作る(2つ条件の両方を満たすものだけを取り出すときは"&"を入れる(例;面積が30㎡未満で駅から300m未満))
#koujitika$d_駅近狭小 <- ifelse(koujitika$地積面積<30 & koujitika$最寄り駅までの距離<300,1,0)

 - その他、地価に影響しそうな要因は、①形状、②水道,③ガス、④下水道、⑤防火といったところでしょうか?

  • 係数ダミー
# 都心までの時間と横浜線の係数ダミー
#koujitika$都心までJR横浜線 <- koujitika$d_JR横浜線*koujitika$山手線からの所要時間

2 関数変換

  • 関数型についてはレジュメNO.3で詳細を説明しています。地価関数については両対数(log-logモデル)を取った方が良さそうですが、実数モデルと対数モデルを比較していきましょう。
  • まず、自然対数変換にはlog関数を使います。
    • ln,logはエルエヌ,エルオージーです(アイではない)。
    • 常用対数に変換するときには、log10を使います。
#koujitika$ln当年価格 <- log(koujitika$当年価格)
  • 0は対数変換ができず、Rで上記のように対数変換をすると、-Inf(infinite;無限)と文字列で記録され、その後の推定ができなくなります。対処方法としては、
    • そのデータを欠損値として削除
    • 0を極小さい数値に置き換える方法があります(厳密には高度な推計手法もあります)
  • 欠損値として処理した場合、例えば”最寄り駅までの距離”であれば、駅近の土地がサンプルから落ちてしまいます。
  • 一方で、0をごく小さな値で置き換える場合、0と0.001の間には大きな違いがあるケースも存在します。どちらがいいかはケースバイケースで考えましょう。
  • ここでは、どれだけ駅近物件でも電車に乗るのには数分かかるということで、ごく小さな値を考えます。
#最寄り駅までの距離にある0を小さな値に置き換える
#koujitika$最寄り駅までの距離 <- ifelse(koujitika$最寄り駅までの距離=="0",0.01,koujitika$最寄り駅までの距離)
#置き換えたデータをつかって改めて対数をとる
#koujitika$ln最寄り駅までの距離 <- log(koujitika$最寄り駅までの距離)
  • その他、容積率、建蔽率、前面道路幅員も0があるので、使う場合は各自変換してください。

3 実数モデルと対数モデルの比較

  • 以下では当年価格を、低層住宅ダミー、山手線からの所要時間、運賃、最寄り駅までの距離、地積、容積率、建蔽率に回帰しています。
    • 対数モデルについては、ダミー変数以外のすべての変数について対数をとっています。
    • 用途地域が、低層住宅とその他地域で切片や傾き(対数では弾力性)がことなっている可能性があるので、定数項ダミーと都心までの時間との係数ダミー(交差効果)を入れています。
      • 対数モデルの係数ダミーは、対数変換したのちにダミー変数をかけます。
#library(modelsummary)
#regs <- list()
#regs[['実数モデル']] <-  lm(当年価格 ~ d_低層+山手線からの所要時間+都心までd_低層+運賃+  最寄り駅までの距離 + 地積面積+容積率+建蔽率,data = koujitika)
#regs[['対数モデル']] <-  lm(ln当年価格 ~ d_低層+ln山手線からの所要時間+ln都心までd_低層+ln運賃+ln最寄り駅までの距離 + ln地積面積+ln容積率+ln建蔽率,data = koujitika)
#msummary(regs, stars= c("*" = .1, "**" = .05, "***" = .01) , gof_omit='RMSE|BIC|Log.Lik.', output='result.xlsx' )
**推定結果**

推定結果

  • 推定結果より、実数と対数を比較すると、両辺対数の方が説明力は高そうなので、今後は対数モデルで説明を行います。
    • このとき、決定係数はモデル選択に使えないことに注意!!!!
    • 両対数モデルの場合、連続変数の係数推定値は弾力性を示します。
    • 定数項ダミーは、近似的な変化率を表しています。たとえば、ダミーの基準を東武東上線とすると、JR中央線ダミーの係数推定値\(\hat{β}\)は、他の要因が全て同じであれば中央線が\(\hat{β}\times 100%\)高いことを意味します。
    • 係数ダミーは、路線別に例を取ると、路線別に弾力性が違うことを意味しています。

4 予測値の計算

  • 上記の推定式(両対数)を用いて予測値を計算してみましょう。
  • シミュレーションとして、地価の予測値を求めるためには、対数の逆関数である指数関数を使う必要があります。具体的には、以下のように、推定された誤差標準誤差(\(\hat{\sigma}\))と対数予測値(\(\widehat{lny}\))を使います。

\[ \hat{y}=\exp(\frac{{\hat{\sigma}}}{2})\exp({\widehat{lny}}) \] - 対数予測値は、両対数の推定式(1)に説明変数の値を代入することでを得ることができます。 \[ \begin{align} &ln(地価)=8.536-1.303*d 低層住宅-0.505*ln都心までの時間 \\ & -0.216*ln山手線からの所要時間*d 低層住宅+0.255*ln運賃-0.129*ln最寄り駅までの距離\\ & +0.181*ln地積面積+0.871*ln容積率-0.075*ln建蔽率 \ \ \ \ \ (1) \end{align} \]

  • ここで、8つの説明変数に値を代入すると、その値に対する地価の予測値が計算されます。Rで新しい関数を作りましょう。
  • 以下その手順を簡単に概説します。
      1. 誤差の標準偏差\(\hat{\sigma}\)を求めます。推定結果の残差とその自由度を用います。
      1. \(\widehat{lny}\)に対する予測値を計算します。予測したい値を一つずつ新しいデータフレームに入れていきます。
      1. 指数関数exp()は対数関数log()の逆関数で、対数化した値を実数に戻します。
      1. function(sigma,y)をオブジェクト名pred(これは各自自由に付けてください)で作成します。
#$\hat[\sigma}$の求め方
#sigma <-sqrt(sum((regs[['対数モデル']]$residuals)^2)/regs[['対数モデル']]$df.residual)
#$\widehat{ln y}$の求め方
#y <- predict(regs[['対数モデル']],newdata=data.frame(d_低層=1, ln山手線からの所要時間=log(10),ln都心までd_低層=1*log(10), ln運賃=log(351), ln最寄り駅までの距離=log(1142), ln地積面積=log(310), ln容積率=log(242),ln建蔽率=log(58)))
#予測値の計算
#pred <-  
  #function(sigma,y)
    #exp(sigma/2)*exp(y)

#この関数pred()に上記の外生変数を下記のように代入し,実行すると,以下のように計算されます。
#pred(sigma, y)
  • これは山手線からの所要時間10,低層住宅,運賃351,最寄り駅までの距離1142,地積面積310,容積率242,建蔽率58の当年価格が2,054,955円になると言うことです。

作業 1.各自の検討路線(3路線)の地価関数を両辺対数で推定してください。ただし,(1)と同じ説明変数にしないこと,少なくとも2つの説明変数を追加してください。

作業 2.推定した関数を用いて予測値を計算してください。予測値の計算にあたっては、各自が用いたデータの平均値を代入してください。ただし、ダミー変数については1か0を用いてください。

※推定に用いた標本についての平均は以下のようなmean関数で求められます。 - 例えば,ln運賃の平均値は下記のようなコマンドになります。

#mln運賃<-mean(regs[['対数モデル']]$model$ln運賃,na.rm = TRUE)

※mean関数では対数が取れない0がある場合、計算できなくなりますのでna.rm = TRUEでnaを除外しています。