# ーーー【ランダム誤差と回帰】ーーー

#【0】直線「y = x」に正規分布誤差を付加する

# 区間 [-1, +1] からランダムに100個の変数値を選ぶ(定義域)
n <- 100
x <- runif(n, min = -1, max = 1)

# ランダム誤差:正規分布 N(0, 0.1)
y <- x + rnorm(n, 0, 0.1)
plot(x, y)

# 回帰直線とそのグラフ描画
一次関数 <- lm(y ~ x)
abline(一次関数, lty=1, lwd=3, col="red")

# 回帰直線の係数
一次関数
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##    0.006063     0.986315
# 回帰直線とデータとのずれ(残差)
names(一次関数)
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
一次関数$model
##                y           x
## 1   -0.284404116 -0.22033115
## 2    0.143864699  0.07761944
## 3    0.146864762 -0.02027945
## 4   -0.375295688 -0.29757074
## 5   -0.233229774 -0.24491521
## 6   -0.855000349 -0.88225741
## 7   -0.995950772 -0.98674201
## 8    0.871006789  0.90833937
## 9    0.560227125  0.78771473
## 10   0.458979646  0.28706745
## 11   0.775008827  0.86495570
## 12  -0.767320464 -0.77819007
## 13  -0.369218203 -0.32740628
## 14   0.814412136  0.80438910
## 15  -0.629948655 -0.82765290
## 16  -1.051150408 -0.93644919
## 17  -0.741608515 -0.54004020
## 18  -0.115432055  0.01396122
## 19  -0.874471143 -0.82109723
## 20   0.656195805  0.56510160
## 21  -0.302637169 -0.23383848
## 22  -0.017242196 -0.08085688
## 23  -0.028632188 -0.03917274
## 24   0.373072243  0.37547118
## 25  -0.781067675 -0.65713085
## 26  -0.705379621 -0.91656133
## 27  -0.489737708 -0.50453863
## 28  -0.804786995 -0.93679737
## 29  -0.858069845 -0.81624660
## 30   0.839003888  0.71889211
## 31   0.199227657 -0.08027072
## 32  -0.121520387 -0.14949266
## 33   0.247944462  0.18869825
## 34   0.618978642  0.50556020
## 35   0.743368517  0.69283550
## 36   0.082240519  0.03715347
## 37  -0.323071074 -0.41714986
## 38   0.451960282  0.52099638
## 39   0.196719600  0.20619420
## 40   0.195704135  0.06881859
## 41   0.580340573  0.48936264
## 42   0.137060611  0.10477698
## 43  -0.157014699 -0.18123664
## 44   0.985149470  0.95903556
## 45  -0.713854029 -0.72646645
## 46   0.782743472  0.83370565
## 47  -0.902755740 -0.98745273
## 48  -0.178441445 -0.33216693
## 49  -0.385024305 -0.38347838
## 50   0.795356882  0.80987869
## 51  -0.912312805 -0.82412305
## 52  -0.667093693 -0.69425198
## 53   0.420010798  0.45526502
## 54  -0.263496660 -0.29459031
## 55  -0.306374147 -0.38534495
## 56   0.099469896  0.21350162
## 57   0.679978234  0.88955102
## 58   0.461595047  0.41498373
## 59  -0.181475488 -0.15993533
## 60  -0.559126047 -0.74379064
## 61   0.443721043  0.41749799
## 62   0.472102098  0.61916594
## 63   0.493021701  0.38275613
## 64   0.738173136  0.70687820
## 65   0.554221962  0.53198521
## 66   0.274275641  0.28376666
## 67  -0.131786178 -0.16798666
## 68   0.261091024  0.32226751
## 69   0.876855997  0.96255713
## 70   0.386067247  0.53995164
## 71  -0.908486307 -0.88925674
## 72  -0.319716657 -0.30593191
## 73   1.001004364  0.97023292
## 74  -0.612020526 -0.56744257
## 75   0.002507615  0.11656987
## 76  -0.313463530 -0.33432759
## 77   0.031320314  0.17603757
## 78   0.154147498  0.33142449
## 79  -0.524498244 -0.32325916
## 80   0.770431861  0.78802901
## 81  -0.931050148 -0.99140977
## 82   0.924794228  0.82574629
## 83   0.544024837  0.47559283
## 84   0.285915220  0.20877691
## 85   0.315529724  0.21336935
## 86  -1.034311443 -0.88585850
## 87   0.177530273  0.16843119
## 88   0.102581472  0.18830129
## 89  -0.016924099 -0.13681600
## 90  -0.542420685 -0.39253147
## 91   0.930521150  0.95008274
## 92   0.490852054  0.26605814
## 93   0.510344653  0.47723782
## 94  -0.706138548 -0.69343064
## 95  -0.665027480 -0.68983108
## 96   0.463125763  0.44639644
## 97   0.692170209  0.76212414
## 98   0.915992231  0.84239894
## 99   0.337989655  0.25849499
## 100 -0.465310237 -0.45878094
fitted <- predict(一次関数)
for (i in 1:100)
  lines (
    c(x[i],x[i]), 
    c(y[i],fitted[i])
  )

#【1】曲線「y = 1 - x^2」に正規分布誤差を付加する

n <- 100
x <- runif(n, min = -1, max = 1)
y <- (1 - x^2) + rnorm(n, 0, 0.04)
plot(x, y)

# 回帰直線とそのグラフ描画
一次関数 <- lm(y ~ x)
abline(一次関数, lty=1, lwd=3, col="red")

# 回帰二次関数とそのグラフ描画
x2 <- x^2
二次関数 <- lm(y ~ x + x2)
xx <- seq(-1, 1, 0.01)
yy <- predict(二次関数, list(x=xx, x2=xx^2))
lines(xx, yy, lty=1, lwd=3, col="blue")

# 回帰二次関数の係数
二次関数
## 
## Call:
## lm(formula = y ~ x + x2)
## 
## Coefficients:
## (Intercept)            x           x2  
##    1.006555     0.004972    -1.009304
#【3】曲線「y = (x - 0.9)*(x - 0.6)*(x - 0.1)*(x + 0.3)*(x + 1)」に正規分布誤差を付加する

n <- 100
x <- runif(n, min = -1, max = 1)
y <- (x - 0.9)*(x - 0.6)*(x - 0.1)*(x + 0.3)*(x + 1) + rnorm(n, 0, 0.04)
plot(x, y)

# 回帰直線とそのグラフ描画
一次関数 <- lm(y ~ x)
abline(一次関数, lty=1, lwd=3, col="red")

# 回帰二次関数とそのグラフ描画
x2 <- x^2
二次関数 <- lm(y ~ x + x2)
xx <- seq(-1, 1, 0.01)
yy <- predict(二次関数, list(x=xx, x2=xx^2))
lines(xx, yy, lty=1, lwd=3, col="blue")

# 回帰三次関数とそのグラフ描画
x3 <- x^3
三次関数 <- lm(y ~ x + x2 + x3)
xx <- seq(-1, 1, 0.01)
yy <- predict(三次関数, list(x=xx, x2=xx^2, x3=xx^3))
lines(xx, yy, lty=1, lwd=3, col="green")

# 回帰四次関数とそのグラフ描画
x4 <- x^4
四次関数 <- lm(y ~ x + x2 + x3 + x4)
xx <- seq(-1, 1, 0.01)
yy <- predict(四次関数, list(x=xx, x2=xx^2, x3=xx^3, x4=xx^4))
lines(xx, yy, lty=1, lwd=3, col="pink")

# 回帰五次関数とそのグラフ描画
x5 <- x^5
五次関数 <- lm(y ~ x + x2 + x3 + x4 + x5)
xx <- seq(-1, 1, 0.01)
yy <- predict(五次関数, list(x=xx, x2=xx^2, x3=xx^3, x4=xx^4, x5=xx^5))
lines(xx, yy, lty=1, lwd=3, col="black")

# 回帰六次関数とそのグラフ描画
x6 <- x^6
六次関数 <- lm(y ~ x + x2 + x3 + x4 + x5 + x6)
xx <- seq(-1, 1, 0.01)
yy <- predict(六次関数, list(x=xx, x2=xx^2, x3=xx^3, x4=xx^4, x5=xx^5, x6=xx^6))
lines(xx, yy, lty=1, lwd=3, col="gray")

# 回帰七次関数とそのグラフ描画
x7 <- x^7
七次関数 <- lm(y ~ x + x2 + x3 + x4 + x5 + x6 + x7)
xx <- seq(-1, 1, 0.01)
yy <- predict(七次関数, list(x=xx, x2=xx^2, x3=xx^3, x4=xx^4, x5=xx^5, x6=xx^6, x7=xx^7))
lines(xx, yy, lty=1, lwd=3, col="gold")

# 回帰八次関数とそのグラフ描画
x8 <- x^8
八次関数 <- lm(y ~ x + x2 + x3 + x4 + x5 + x6 + x7 + x8)
xx <- seq(-1, 1, 0.01)
yy <- predict(八次関数, list(x=xx, x2=xx^2, x3=xx^3, x4=xx^4, x5=xx^5, x6=xx^6, x7=xx^7, x8=xx^8))
lines(xx, yy, lty=1, lwd=3, col="violet")