2007/11/02

R 入門

R 入門

Installation

http://cran.md.tsukuba.ac.jp/


GUI - R Commander

http://socserv.mcmaster.ca/jfox/Misc/Rcmdr/installation-notes.html
http://en.wikipedia.org/wiki/R_Commander


Plugin

http://en.wikipedia.org/wiki/Gretl


Other Reference

http://en.wikipedia.org/wiki/Journal_of_Statistical_Software
http://en.wikipedia.org/wiki/R_(programming_language)


Rとは?

R は統計計算とグラフィックスのためのフリーソフト(GNU-style copyleft)である。 Rは商用ソフトのS(AT&T ベル研究所のRichard A. Becker, John M. Chambers, and Allan R. Wilks により作られた統計解析やグラフィックスのための言語であり、製品としては S version 4 や S-Plusがある)に操作環境などが良く似ており、Sを使っている場合には関数の利用法がほぼ同じことから取っつきやすく、Sで定義した関数などはRでもほとんど変更なしに動作する。

Sの現在のバージョンほどは新たな手法やグラフ表示法は取り入れられていないが、通常の解析ならば不都合は感じないだろう。 CRAN(The Comprehensive R Archive Network)にはRに対する追加パッケージも沢山あり、新たな手法は、これらのパッケージを追加することにより解決する場合が多々ある。 RはSのクローンのフリーウェアと捉えられがちだが、全くのクローンではなく(もちろん完全なクローンを目指しているわけでもない)、内部的な構成などはSとは全く異なる。 詳細は R FAQの 3.3 What Are the Differences between R and S? に記載されている。

Rの利用方法はNotes on Rというドキュメントにまとめられていますが、山本和彦氏や東工大の間瀬氏が中心となり翻訳プロジェクト(ホームページでの呼びかけで集まった有志による)が組まれ、日本語版として利用できる。
・情報
R のホームページ:http://stat.auckland.ac.nz/r/r.html
CRAN:http://www.ci.tuwien.ac.at/R/
日本語による紹介:http://stat.sm.u-tokai.ac.jp/~yama/R/
R に関するページ(山本和彦氏):http://www.gin.or.jp/users/tettiri/R/rindex.htm

・参考文献
Notes on R(CRANのhttp://www.ci.tuwien.ac.at/R/#docから入手できる。)
Rノート(Notes on Rの邦訳) http://www.gin.or.jp/users/tettiri/R/rh3.htm
その他「使いながら学ぶS言語」や「Sによるデータ解析」などのSの参考書

・入手とインストール
Rの使用方法

Rにも非常によい入門用のテキストNotes on Rがインターネットで公開されているので、それをテキストとすれば習熟度はおのずと上がるだろう。R-jp プロジェクトによりNotes on Rは日本語訳が利用できる。RはS言語と互換があるので、Sのテキストも参考になるだろう。
起動と終了

起動後の R システムでは、> (プロンプト)が命令を待っている。ここに、式を入力すれば、その式を評価した結果が返る。また、単に数値を入力すると、その数値を表示する。そして、次のコマンドを待つプロンプトを表示する。終了は 命令

> q()


で行なわれる。また、demo("topic名")でデモを実行できるので、どんなことができるかざっと確認するには良いだろう。demo()によりトピック名が表示されるので、トピック名を確認後デモを行うと良いだろう。
プロンプトに与える命令は、関数(引数) の形で与える。関数などの名前は大文字小文字を区別することに注意せよ。
電卓としての利用
数値演算は、演算子(+,-,*,/,^) を用いて通常の書式で計算が行える。Rには三角関数(cos(), sin(), tan())や、平方根 sqrt()、自然対数 log()などの算術関数も用意されている。また、π(pi)などの定数も用意されている。 10人の身長などのデータに関して統計量を計算する場合に、Rでは c 関数を使って数値をまとめたベクトルオブジェクトとして扱う。R には統計量を計算する多くの統計関数が用意されている。例えば、

> mean(c(148, 160, 159, 153, 151, 140, 158, 137, 149, 160))
[1] 151.5


のように、データに平均を計算する関数mean()を作用させる。このように、データに対する計算を行なう場合に、常にデータを記述するのは面倒であり、そのために<-演算子を利用して適当な名前に付置して、その名前に対して計算を行なう。データとして数値以外にも文字も扱えるがその場合には"(ダブルクォート)でくくる。
データの定義
利用するデータをたびたび入力する手間を省くために<- 演算子を利用し、付置した名前に対して関数を適用する。

> height <- c(148, 160, 159, 153, 151, 140, 158, 137, 149, 160)
> weight <- c(41, 49, 45, 43, 42, 29, 49, 31, 47, 47)
> height
[1] 148 160 159 153 151 140 158 137 149 160
> weight
[1] 41 49 45 43 42 29 49 31 47 47
> mean(height)
[1] 151.5
> c("x1", "x2", "x3")-> xname


<- 演算子の代わりに-> 演算子を使い逆方向になっても、矢印方向に対する付置する。
データや解析結果の保存
Rでは、自分で定義した変数などは終了時に「Save workspace image?」と聞かれる。これに対して「はい」と答えることによりR起動ショートカットの作業ディレクトリに.RDataというファイルに保存され、次回の起動時に自動的にロードされ、利用することが可能となる。ユーザが使用しているオブジェクトは objects() 関数(古いSの関数ls() も利用できる)により確認できる、引数なしで全てのオブジェクトを表示し、引数として pat="パターン"を指定することによりパターンを満たす名前だけを表示する。いらなくなったオブジェクトは、rm()関数で削除する。

> objects ()
[1] "height" "weight" "xname"
> objects (pat="we*")
[1] "weight"
> rm("xname")
> objects ()
[1] "height" "weight"


標準出力に表示される結果をファイルに出力する場合には、sink()関数の引数に保存するファイル名を指定する。その後は、実行結果は標準出力には表示されずに、指定したファイルに書き込まれる。記録をやめ、再度標準出力に表示をうつす場合には、引数なしのsink()を利用する。

> sink("yama.log")
> objects()
> table(height)
> mean(height)
> sink()


  データをファイルに出力するにはwrite()関数を利用する。
ヘルプ
R には沢山の関数があるが、それら全て、その使用方法を覚えておくことは不可能だろう。そこで、関数の使用方法などについては、ヘルプを参照する。ヘルプには2種類あり、一つ目はhelp()関数に引数として、関数名を""で囲んで指定する。もう一つは、help.start()または「Help」メニューから「R language (html)」を選びHTMLヘルプを利用する。HTMLヘルプは非常に利用しやすいだろう。キーワード指定で関数名を検索する場合にはapropos()関数を利用すると良いだろう。

> help("write")
> help.start()
updating HTML package listing
updating HTML search index
If nothing happens, you should open `C:\PROGRA~1\R\rw2001\doc\html\rwin.html ' yourself
> apropos("norm")
[1] "dlnorm" "dnorm" "plnorm" "pnorm" "qlnorm" "qnorm" "qqnorm" "rlnorm" "rnorm"


 
データのファイルからの読み込み
データ解析で扱うデータは、手で容易に入力できるものではないことが多い。 多くの場合、データはテキストファイルとして用意されているだろう。 例えば、先ほど扱った身体測定データは、実は次のように30人からのデータの 先頭の一部分だったとしよう。
--height(身長)--
148 160 159 153 151 140 158 137 149 160
151 157 157 144 139 139 149 142 150 139
161 140 152 145 156 147 147 151 141 148

--weight(体重)--
41 49 45 43 42 29 49 31 47 47
42 39 48 36 32 34 36 31 43 31
47 33 35 35 44 38 30 36 30 38


30人程度になると打ち込むのも面倒になる。このデータが次の形式ですでにsample1.datという名前でテキストファイルとしてある場合には、このファイルからデータを読み込むことになる。(このリンクを右クリックして「ファイルに保存」を選択して、Rのデータディレクトリに保存する。)
148 41
160 49
159 45

% 中略

141 30
148 38


データをファイルから入力するにはscan()関数を利用する。 (データフレームとして扱う場合については後述する) 引数はfile="ファイル名"、sep="区切り文字"などを指定する。空白により固定長に整形してあるデータの場合sep引数はいらないが、カンマ区切りの場合はsep=","と指定する。複数の変数を扱い場合には後述するデータフレームを利用するのがいいが、scan関数で扱う場合には注意が必要である。scan関数は、改行を区切り記号としてしか扱わないので、2列10行でデータを入力している場合でも

> in1 <- scan("sample1.dat")
Read 60 items
> in1
[1] 148 41 160 49 159 45 153 43 151 42 140 29 158 49 137 31 149 47 160
[20] 47 151 42 157 39 157 48 144 36 139 32 139 34 149 36 142 31 150 43
[39] 139 31 161 47 140 33 152 35 145 35 156 44 147 38 147 30 151 36 141
[58] 30 148 38


のように1つのリストとして読み込まれてしまう。(ここでin1に対する戻り値の左端の[]付きの数字は、その行の先頭要素の順番を表示している。)そこで2つ目の引数として指定されたデータの型のリストとして読み込むように指定する。型は数値の場合0をラベルの場合""を指定する。

> in1 <- scan("sample1.dat", list(0,0))
Read 30 lines
> in1
[[1]]
[1] 148 160 159 153 151 140 158 137 149 160 151 157 157 144 139 139 149 142 150
[20] 139 161 140 152 145 156 147 147 151 141 148

[[2]]
[1] 41 49 45 43 42 29 49 31 47 47 42 39 48 36 32 34 36 31 43 31 47 33 35 35 44
[26] 38 30 36 30 38


すると、リストのリストを生成する。リストの要素にアクセスするには、リスト名[[インデックス]]と指定すればよい。従って、得られたリストin1の第一要素のリストをheight、第二要素をweightとして取り込むには、以下のように指定すればよい。

> height <- in1[[1]]
> weight <- in1[[2]]


別の方法は、行列として読み込むことである。

> in2 <- matrix(scan("sample1.dat"),ncol=2, byrow=T)
Read 60 items
> in2
[,1] [,2]
[1,] 148 41
[2,] 160 49
[3,] 159 45
[4,] 153 43
[5,] 151 42
(中略)
[29,] 141 30
[30,] 148 38


この場合、先ほどのリストのリストとの扱いの違いを理解しておいた方がよい。
行列の行または列の要素に対して関数を適用するにはapply()関数を使い、第2引数の指定により行(=1)または列(=2)を指定する。

> in2[[1]]
[1] 148
> in2[,1]
[1] 148 160 159 153 151 140 158 137 149 160 151 157 157 144 139 139 149 142 150
[20] 139 161 140 152 145 156 147 147 151 141 148
> in2[1,]
[1] 148 41
> in2[[1,2]]
[1] 41
> apply(in2,2,mean)
[1] 171.4 61.6


基本統計量の計算
Rには統計値を求める多くの関数がある。基本統計量に関しても、mean(), median(),max(),min(),var(),sd()などがある。Rの分散は不偏分散(サンプル数ではなくサンプル数から1を引いたもので割っている)であることに注意せよ。

> mean(height)
[1] 149
> var(height)
[1] 53.51724
> sd(height)
[1] 7.315548


カテゴリカルデータは文字列ベクトルで定義すればよい。性別を"M", "F" であらわすとするとき、とc("M","M",..)のように全てを逐一並べたて定義しても良いが、30人中前の16人が男("M")、残りが女("F")だとすると、繰り返しのリストを生成するrep()関数を使うと良いだろう。

> sex <- c(rep("M", time=16),rep("F",time=14))
> sex
[1] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "F" "F" "F"
[20] "F" "F" "F" "F" "F" "F" "F" "F" "F" "F" "F"


このような属性データを利用して属性ごとに統計量を計算したいこともあるだろう。その場合には、tapply()関数を利用するする。引数は、オブジェクト、属性オブジェクト、統計量である。利用方法を例で示すが、下の例でrange()関数はオブジェクトの最小値と最大値を返す。

> tapply(height,sex,mean)
F M
147.7143 150.1250
> tapply(weight,sex,range)
$F
[1] 30 47

$M
[1] 29 49


度数表を作成するには、table()関数を使う。単純にtable()関数を使った場合には、各値ごとにその度数をカウントするので、cut()関数を使い区間データとして扱うなどの方法により区間に対する集計ができる。(他にも後述するヒストグラムの作成による方法なども使える)

> table(sex)
sex
F M
14 16
> table(height)
> table(height)
height
137 139 140 141 142 144 145 147 148 149 150 151 152 153 156 157 158 159 160 161
1 3 2 1 1 1 1 2 2 2 1 3 1 1 1 2 1 1 2 1
> table(cut(height,seq(135,165,by=5)))

(135,140] (140,145] (145,150] (150,155] (155,160] (160,165]
6 4 7 5 7 1


上の例で利用したseq()関数は、初期値から終端値までのby=で指定された間隔の数列を生成する関数である。by=指定がない場合の増分は1である。また単純にnからmまでの増分が1の数列はn:mとして生成できる。
データフレーム
sexは単なる文字列ベクトルではなく、2つの水準"M", "F"を持つ因子として扱った方が便利であることから、factor()関数を使い因子オブジェクトとして扱われるsexfを作ってみよう。

> sexf <- factor(sex)
> sex
[1] "M" "M" "M" "M" "M" "M" "F" "F" "F" "F"
> sexf
[1] M M M M M M F F F F
Levels: F M
>


内部の扱いに変化があったことがわかるだろう。
ある標本に対していくつかの変数の観測を得た場合には、それらをまとめて扱いたい。Rではデータフレームというオブジェクトがその役割をなす。データフレームは、コンポーネントとしてベクトル、因子、数値行列、リスト、他のデータフレームを持つ。これまでに扱った変量height, weight, sexは同一標本から得られた対応のあるデータなので、これをデータフレームphys.dfとする。

> phys.df <-data.frame(pheight=height,pweight=weight,psex=sexf)
> phys.df
pheight pweight psex
1 148 41 M
2 160 49 M
3 159 45 M
4 153 43 M
5 151 42 M

中略

29 141 30 F
30 148 38 F


個々の変量は、データフレーム名$変量名でアクセスできる。

> pheight
Error: Object "pheight" not found
> phys.df$pheight
[1] 148 160 159 153 151 140 158 137 149 160 151 157 157 144 139 139 149 142 150
[20] 139 161 140 152 145 156 147 147 151 141 148


データフレームを利用することでデータフレーム内の変量に対して扱い方が変わる。要約もまとめてできるし、モデルとして扱えるようになる。

> summary(phys.df)
pheight pweight psex
Min. :137.0 Min. :29.00 F:14
1st Qu.:142.5 1st Qu.:33.25 M:16
Median :149.0 Median :38.00
Mean :149.0 Mean :38.70
3rd Qu.:155.3 3rd Qu.:43.75
Max. :161.0 Max. :49.00


しかし、このデータフレーム内の変量を呼ぶ$表記はたいてい面倒である。 これを解決するのが、attach()関数であり、attach()で追加されたものを外すのがdetach()である。

> pheight
Error: Object "pheight" not found
> attach(phys.df)
> pheight
[1] 148 160 159 153 151 140 158 137 149 160 151 157 157 144 139 139 149 142 150
[20] 139 161 140 152 145 156 147 147 151 141 148
> detach(phys.df)
> pheight
Error: Object "pheight" not found


ファイルからのデータフレームの読み込みはread.table()関数を利用する。 行ラベル(ケース名など)と列ラベルがあるテキストデータに対して作用する。行ラベルがない場合にはheader=T引数を付けることにより読み込むことができる。 例えば、以下の内容のデータ(sample1.csv)を読み込むとしよう。
height,weight,sex
148,41,M
160,49,M
159,45,M
153,43,M

% 中略

141,30,F
148,38,F


この場合、カンマ区切りデータであり、列ラベル(変数名)はあるが行ラベルがないので次のようにオプションを指定する。

> phys<- read.table("sample1.csv",header=T, sep=",")
> phys
height weight sex
1 148 41 M
2 160 49 M
3 159 45 M
4 153 43 M
5 151 42 M
6 140 29 M

中略

29 141 30 F
30 148 38 F



グラフの作図
Rにおいて利用できる統計グラフの多くはplot()関数で作成できるが、そのほかにもヒストグラムを作成するhist()や箱ひげ図を作成するboxplot()など様々なグラフ作成関数がある。 「複数図表モード」もあり、表現力に幅がある。どんなグラフが描けるのか知りたい場合には、デモを確認してみよう。

> demo(graphics)


色の指定も細やかにできることが確認できる。 一変量データのグラフ表現としては、ヒストグラムを表示する関数hist() や 箱ひげ図をプロットする boxplot() などがある。hist() は引数の指定によりかなり自由度が高い。何も指定しなかった場合と、breaks=の値を変えて階級数を変更した場合を比べてみよう。breaks=にスカラー値(定数)を与えるとおおよそその数に近い階級数の適当なヒストグラムを作成するが、区切り値を0や5などのキリのいいところに設定するため思うように指定できないかもしれない。 その場合には、breaks=に区切り値のリストを与えることにより解決できる。

> hist(height)
> hist(height,breaks=3)
> hist(height,br=c(136,140,144,148,152,156,160,170))


さらに、histを使ってできることを試してみよう。par()関数によりグラフィックスのパラメータが変更されるが、この変更は今後のグラフィックス全てに影響するので、par()関数を使う場合には、変更前の内容を保存しておき、グラフの利用が終わったところで元に戻す。

> op <- par(mfrow=c(1,2)) #複数グラフモード、opにグラフパラメータを保存
> hist(height)
> hist(weight)
> hist(height, br=5,col="lightblue", border="pink")
> par(op) #複数グラフモードの終了
> str(hist(height,plot=F))
List of 4
$ breaks : num [1:7] 135 140 145 150 155 160 165
$ counts : int [1:6] 6 4 7 5 7 1
$ intensities: num [1:6] 0.0400 0.0267 0.0467 0.0333 0.0467 ...
$ mids : num [1:6] 138 143 148 153 158 ...
> h <- hist(height,plot=F)
> h$counts
[1] 6 4 7 5 7 1


これで、hist()が単にヒストグラムを描くだけでなく、ヒストグラムを構成する階級の情報を持っており、それに対してアクセスできることがわかる。またstem(height)は葉茎図(stem & Leaf plot)を与える。 boxplot() は箱ひげ図を作成する。この箱ひげ図は外れ値が○で表示されるタイプである。リストに対して、インデックスでなく論理値を与えることにより、条件を満たす要素からなるリストを作ることができる。これを使って、性別で分けた箱ひげ図を描くことができる。

> boxplot(height)
> boxplot(height[(sex=="M")],height[(sex=="F")],names.x=c("Male","Female"))



plot() は引数として与えるデータにより、インデックスプロットや散布図などのx-yプロットをはじめ様々なグラフが作成できる。

> plot(height)
> plot(seq(1,length(height)),height,type="b",xlab="") #上と同じインデックスプロット
> plot(height,weight) #散布図



データフレームや因子などの型の指定が行われている場合には、振る舞いや指定が異なるので、うまく利用すること。

> boxplot(pheight~psex, data=phys.df)
> plot(sexf)
> plot(sex) #因子でなく文字列のリストなので
Error in plot.window(xlim, ylim, log, asp, ...) :
need finite ylim values
In addition: Warning messages:
1: NAs introduced by coercion
2: no finite arguments to min; returning Inf
3: no finite arguments to max; returning -Inf
> plot(phys.df) #データフレームをプロットすると
> plot(pweight~pheight, data=phys.df)



ユーザ定義関数
Rにおける関数定義は > funcname <- function(arg1,..) expression の形で行われ、funcnameが関数名、arg1,..が引数、expressionが本体である。Rで利用できる関数も大半はRで定義したものである。関数名に括弧を付けずに入力すると関数の内容が表示される。関数varを見てみよう。

var
function (x, y = x, na.rm = FALSE, use)
{
if (missing(use))
use <- if (na.rm)
"complete.obs"
else "all.obs"
cov(x, y, use = use)
}


関数varが関数covを利用して作られていることがわかる。 トリム平均(最大値と最小値を除いた平均)を求める関数 tmean を作ってみよう。

tmean <- function (x)
{
(sum(x)-max(x)-min(x))/(length(x)-2)
}


次のように、ローカル変数を使うこともできる(tsum, tlen がローカル変数)。

tmean2 <- function (x)
tsum <- sum(x)-max(x)-min(x)
tlen <- length(x)-2
tsum/tlen
}


制御構造や引数についてなど関数を作る際には注意することが多いが、ここでは扱わない。Notes on Rなどで理解して欲しい。 自分で作った関数は、ファイルに保存しておく、そのようなRのコマンドをファイルから読み込む場合にはsource()関数を利用する。
統計モデル
RはSと同様に統計モデル(回帰モデル、分散分析、一般化線形モデル、非線形回帰モデルなど)のモデリングができる。例として、車の運転者と自転車の運転者との自転車レーンの効果について、自転車運転者と道路の中心線との距離travel と自転車運転者と通過車両との距離separation とについて 10 人の自転車運転者について調査した結果を考察する(bicycle.csv :LISP-STAT, 1997, 共立出版)。このデータに回帰モデルをあてはめ解析してみよう。モデルとしてまず、目的(従属)変量としてseparation、説明(独立)変量としてtravelとした線形回帰モデルを考えると、線形モデルの関数lmを使ったモデルの指定は次のようになる。

> bicycle <- read.table("bicycle.csv",header=T,sep=",")
> bicycle
travel separation
1 12.8 5.5
2 12.9 6.2
3 12.9 6.3
4 13.6 7.0
5 14.5 7.8
6 14.6 8.3
7 15.1 7.1
8 17.5 10.0
9 19.5 10.8
10 20.8 11.0
> lm(separation ~ travel, data=bicycle)

Call:
lm(formula = separation ~ travel, data = bicycle)

Coefficients:
(Intercept) travel
-2.1825 0.6603


回帰モデル の結果からこのモデルに対する回帰係数が切片項が -2.1825、1次の項の係数が0.6603であることがわかる。この結果の返り方からlm()の結果はオブジェクトであることが分かる。確かに、lm()の結果はオブジェクトであり、lm()を適用したときに結果として表示される以外の情報も持っている。lm()の結果を適当な名前で付置し、そのオブジェクトに対してsummary()を適用するともう少し詳細な情報が得られるし、そのオブジェクトに対して回帰係数を表示するように問い合わせることなどもできる。

> bicycle.lm <- lm(separation ~ travel, data=bicycle)
> summary(bicycle.lm)

Call:
lm(formula = separation ~ travel, data = bicycle)

Residuals:
Min 1Q Median 3Q Max
-0.76990 -0.44846 0.03493 0.35609 0.84148

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.18247 1.05669 -2.065 0.0727 .
travel 0.66034 0.06748 9.786 9.97e-06 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 0.5821 on 8 degrees of freedom
Multiple R-Squared: 0.9229, Adjusted R-squared: 0.9133
F-statistic: 95.76 on 1 and 8 degrees of freedom, p-value: 9.975e-006
> coef(bicycle.lm)
(Intercept) travel
-2.1824715 0.6603419


データフレームが保持しているコンポーネントの名前はnames()で確認できる。

> names(bicycle.lm)
[1] "coefficients" "residuals" "effects" "rank"
[5] "fitted.values" "assign" "qr" "df.residual"
[9] "xlevels" "call" "terms" "model"
> bic.lm.summary<-summary(bicycle.lm)
> names(bic.lm.summary)
[1] "call" "terms" "residuals" "coefficients"
[5] "sigma" "df" "r.squared" "adj.r.squared"
[9] "fstatistic" "cov.unscaled"
> bic.lm.summary$residuals
1 2 3 4 5 6
-0.76990432 -0.13593851 -0.03593851 0.20182219 0.40751451 0.84148033
7 8 9 10
-0.68869060 0.62648893 0.10580520 -0.55263922
> resid(bicycle.lm)
1 2 3 4 5 6
-0.76990432 -0.13593851 -0.03593851 0.20182219 0.40751451 0.84148033
7 8 9 10
-0.68869060 0.62648893 0.10580520 -0.55263922


残差プロットや残差のQ-Qプロットを確認する。

> plot(resid(bicycle.lm))
> qqnorm(resid(bicycle.lm))


更に、2次の項を含むモデルに更新する。更新はupdate()関数を使い、モデルの差分の部分を記述する。元のモデルにtravelの2次の項を追加する。

> bicycle.lm2 <- update(bicycle.lm, . ~ .+I(travel^2))
> summary(bicycle.lm2)

Call:
lm(formula = separation ~ travel + I(travel^2), data = bicycle)

Residuals:
Min 1Q Median 3Q Max
-1.04030 -0.03974 0.14687 0.20731 0.58317

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -16.41924 7.84827 -2.092 0.0747 .
travel 2.43267 0.97196 2.503 0.0408 *
I(travel^2) -0.05339 0.02923 -1.827 0.1105
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 0.5121 on 7 degrees of freedom
Multiple R-Squared: 0.9478, Adjusted R-squared: 0.9329
F-statistic: 63.54 on 2 and 7 degrees of freedom, p-value: 3.251e-005

>


修正R自乗(Adjusted R-squared)が0.9133から9.329になったことなどから、モデルが改善されたことが確認できる。

No comments: