備忘ログ

チラシの裏的備忘録&メモ

Rのlmで切片のみの回帰直線(?)、原点を通る(切片なしの)回帰直線(?)を描く方法

基本的には自分用のメモ。

それは回帰直線なのかということはひとまずおいておいて。

使い道としてはいろいろあるけど、この項の主旨と異なるのでひとまずおいておく。

まずはRのlmで線形回帰分析

データはRにもとも入っているOangeのデータを使います。

head(Orange)
##   Tree  age circumference
## 1    1  118            30
## 2    1  484            58
## 3    1  664            87
## 4    1 1004           115
## 5    1 1231           120
## 6    1 1372           142

ageは1968年12月31日からの樹齢(日)、circumferenceは樹の円周(mm)(要するに大きさ、正しい用語がわからない)。

プロットすると

plot(Orange$age,Orange$circumference)

で普通の線形回帰分析をlm行うならば、

lm(Orange$circumference~Orange$age)

と書いて、中身を見たければとりあえずsummary関数を使って

summary(lm(Orange$circumference~Orange$age))
## 
## Call:
## lm(formula = Orange$circumference ~ Orange$age)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -46.310 -14.946  -0.076  19.697  45.111 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 17.399650   8.622660   2.018   0.0518 .  
## Orange$age   0.106770   0.008277  12.900 1.93e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.74 on 33 degrees of freedom
## Multiple R-squared:  0.8345, Adjusted R-squared:  0.8295 
## F-statistic: 166.4 on 1 and 33 DF,  p-value: 1.931e-14

となります。

プロット図に重ねて描きたければ

plot(Orange$age,Orange$circumference)
abline(lm(Orange$circumference~Orange$age))

で線形回帰分析は終了。

Rのlmで切片のみの回帰直線(?)を描く方法

lmで切片のみ、つまり傾きなしの直線を描くには、lmの~の後ろに1をつければいい。

lm(Orange$circumference~1)

summaryで中身を見てみると

summary(lm(Orange$circumference~1))
## 
## Call:
## lm(formula = Orange$circumference ~ 1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -85.857 -50.357  -0.857  45.643  98.143 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  115.857      9.717   11.92 1.08e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 57.49 on 34 degrees of freedom

でちゃんとInterceptのみになっている

cricumferenceの1次元で見てるだけなので回帰といってもあたりまえだけど

mean(Orange$circumference)
## [1] 115.8571

とcricumferenceの平均値とInterceptのEstimateは一致する

なのでプロットに重ねるときには

plot(Orange$age,Orange$circumference)
abline(lm(Orange$circumference~1))

でy軸に直交する回帰直線(?)が描ける。

本当にただ、切片のみの直線を引きたいだけのときは

plot(Orange$age,Orange$circumference)
abline(a=mean(Orange$circumference),b=0)

でプロット上同じ結果がでる(a=、b=は省略可能)。

ただ、y軸の平均値のラインをひいているだけだけど。

ablineは

abline(h=mean(Orange$circumference))

でも同じ。

Rのlmで切片なしの回帰直線を描く方法

lmで切片なし、つまり原点を通る回帰直線(?)を描くためにはlmの~の最後に+0か-1書くといい。

lm(Orange$circumference~Orange$age+0)

または

lm(Orange$circumference~Orange$age-1)

で、中身を見るためにはsummaryで

summary(lm(Orange$circumference~Orange$age+0))
## 
## Call:
## lm(formula = Orange$circumference ~ Orange$age + 0)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -52.297  -8.832   6.289  20.180  44.960 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## Orange$age 0.121553   0.004022   30.23   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.79 on 34 degrees of freedom
## Multiple R-squared:  0.9641, Adjusted R-squared:  0.9631 
## F-statistic: 913.6 on 1 and 34 DF,  p-value: < 2.2e-16

でInterceptなし、つまり切片なしの原点を通る回帰直線が求められる。 念のためもう一つも確認のためやってみると

summary(lm(Orange$circumference~Orange$age-1))
## 
## Call:
## lm(formula = Orange$circumference ~ Orange$age - 1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -52.297  -8.832   6.289  20.180  44.960 
## 
## Coefficients:
##            Estimate Std. Error t value Pr(>|t|)    
## Orange$age 0.121553   0.004022   30.23   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 24.79 on 34 degrees of freedom
## Multiple R-squared:  0.9641, Adjusted R-squared:  0.9631 
## F-statistic: 913.6 on 1 and 34 DF,  p-value: < 2.2e-16

で同じ結果が出る。

プロットに重ねて書くなら、

plot(Orange$age,Orange$circumference,xlim = c(0,1600), ylim = c(0,210))
abline(lm(Orange$circumference~Orange$age+0))

で描ける。

ちなみに、2変量の場合、ageとcircumstanceのピアソンの相関係数

cor(Orange$age,Orange$circumference)
## [1] 0.9135189

と、ageとcircumstanceを標準化した原点を通る回帰直線の回帰係数は

Orange.z <- scale(Orange[,2:3])
Orange.z <- data.frame(Orange.z)
summary(lm(Orange.z$circumference~Orange.z$age+0))
## 
## Call:
## lm(formula = Orange.z$circumference ~ Orange.z$age + 0)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.80556 -0.25999 -0.00133  0.34263  0.78471 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## Orange.z$age  0.91352    0.06977   13.09 7.74e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4068 on 34 degrees of freedom
## Multiple R-squared:  0.8345, Adjusted R-squared:  0.8296 
## F-statistic: 171.5 on 1 and 34 DF,  p-value: 7.74e-15

で同じになる。

あたり前田のクラッカー。

そもそも2変量とも標準化しているので、線形回帰分析は原点を通る設定を指定なくても切片は0になる。

summary(lm(Orange.z$circumference~Orange.z$age))
## 
## Call:
## lm(formula = Orange.z$circumference ~ Orange.z$age)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.80556 -0.25999 -0.00133  0.34263  0.78471 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.00000    0.06980     0.0        1    
## Orange.z$age  0.91352    0.07081    12.9 1.93e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4129 on 33 degrees of freedom
## Multiple R-squared:  0.8345, Adjusted R-squared:  0.8295 
## F-statistic: 166.4 on 1 and 33 DF,  p-value: 1.931e-14

ただし、その他のp値などはInterceptをいれるかどうかで変わってくる。

あたり前田のクラッカー(天丼)。

この記事は.Rmdでできたhtmlをそのまま貼ってみた。