require(tidyverse)
require(plotly)
2024年度の水稲圃場実習では,要因として品種(4 品種)と施肥量(低リンと高リン)を取り上げた。なお、同様の実習が2019年度より行われているが、施肥は低窒素と高窒素の比較が行われていた。また、2022年以前はモミロマンを除いて異なる品種が栽培されていた。また、2022年度以降は水田の改修があったため影響で土壌の性質が変化している可能性もある。
施肥管理を効率的に行うため施肥管理を主区(1 次因子)、品種を副区(2 次因子)とした分割区法 (split-plot design)を用い、3 反復の実験を行った。
2023年度における試験区のある形質の測定値を \(Y_{ijk}\) とすると, \(Y_{ijk}\) の統計(構造)モデルは,1次因子水準数 \(a = 2\),2次因子水準数 \(b = 4\),反復 \(r = 3\),として,
\[ Y_{ijk} = \mu + \alpha_i + \rho_k + e_{ik}^1 + \beta_j + (\alpha \beta)_{ij} + e_{ijk}^2, \ i=1,\ldots,a, j=1,\ldots,b, k=1,\ldots,r \] とおける.ただし,\(\mu\) は総平均,\(\alpha_i\) は施肥効果,\(\beta_j\) は品種効果,\((\alpha\beta)_{ij}\) は 施肥量と品種の交互作用,\(\rho_k\) はブロック効果,\(e_{ik}^1\) は 1次誤差、\(e_{ijk}^2\) は 2次誤差である.ブロック効果は、\(\rho_k \sim N(0, \sigma_B^2)\) を満たす変量(確率変数)で、誤差は,\(e_{ik}^1 \sim N(0, \sigma^2_1)\)、\(e^2_{ijk} \sim N(0, \sigma^2_2)\) を満たす互いに独立な変量であるとする。
1次誤差を用いて施肥効果やブロック効果を検定し、2次誤差を用いて品種効果や施肥と品種の交互作用を検定する。このため乱隗法に比べ、1次因子(施肥量)の効果に対する精度は落ちるが、2次因子(品種)や交互作用に対する精度は向上すると考えられる。
データの読み込み
df <- read.csv("riceexp23.csv", stringsAsFactors = TRUE)
head(df)
## Plot Year Rep Fertilizer Variety GrowSta_N_stems GrowSta_Plant_height
## 1 1 2023 1 Low_N Tachiayaka 251.8519 48.93333
## 2 2 2023 1 Low_N Momiroman 185.1852 31.43333
## 3 3 2023 1 Low_N Hokuriku193 266.6667 34.93333
## 4 4 2023 1 Low_N Koshihikari 207.4074 36.93333
## 5 5 2023 1 High_N Hokuriku193 281.4815 35.53333
## 6 6 2023 1 High_N Momiroman 392.5926 33.46667
## GrowSta_SPAD N_panicles N_grains_per_panicle N_grains_total Ripening_rate
## 1 43.96667 240.7407 164.2473 39541.03 0.6446330
## 2 35.53333 255.5556 258.2713 66002.67 0.3463521
## 3 38.50000 311.1111 136.1658 42362.69 0.8569052
## 4 38.23333 414.8148 126.1533 52330.27 0.5750007
## 5 38.46667 314.8148 169.6984 53423.57 0.6945010
## 6 37.33333 248.1481 257.3938 63871.80 0.2982613
## Thousand_grain_weight Grain_yield_gross Grain_yield Sink_capacity
## 1 28.00000 812.8922 713.7046 1107.149
## 2 27.05882 963.7093 544.6303 1785.955
## 3 27.29412 1053.5568 990.7985 1156.252
## 4 24.94118 933.6343 750.4786 1305.179
## 5 26.82353 1121.9526 795.3247 1433.009
## 6 27.52941 883.0191 524.4486 1758.353
## Sink_filling_rate Dry_weight_stems_leaves Harvest_index
## 1 0.7342213 884.4444 0.5195295
## 2 0.5396045 963.3333 0.5406374
## 3 0.9111825 1206.6667 0.5067069
## 4 0.7153307 894.4444 0.5511704
## 5 0.7829349 931.1111 0.5863669
## 6 0.5021853 971.1111 0.5168498
データのサマリをみる。
summary(df)
## Plot Year Rep Fertilizer Variety
## Min. : 1.00 Min. :2023 Min. :1 High_N:12 Hokuriku193:6
## 1st Qu.: 6.75 1st Qu.:2023 1st Qu.:1 Low_N :12 Koshihikari:6
## Median :12.50 Median :2023 Median :2 Momiroman :6
## Mean :12.50 Mean :2023 Mean :2 Tachiayaka :6
## 3rd Qu.:18.25 3rd Qu.:2023 3rd Qu.:3
## Max. :24.00 Max. :2023 Max. :3
## GrowSta_N_stems GrowSta_Plant_height GrowSta_SPAD N_panicles
## Min. :185.2 Min. :30.07 Min. :35.53 Min. :218.5
## 1st Qu.:246.3 1st Qu.:35.48 1st Qu.:38.41 1st Qu.:261.1
## Median :311.1 Median :41.38 Median :40.42 Median :277.8
## Mean :323.8 Mean :41.79 Mean :41.07 Mean :295.8
## 3rd Qu.:392.6 3rd Qu.:46.02 3rd Qu.:43.14 3rd Qu.:326.9
## Max. :555.6 Max. :57.60 Max. :51.60 Max. :414.8
## N_grains_per_panicle N_grains_total Ripening_rate Thousand_grain_weight
## Min. : 94.71 Min. :25257 Min. :0.2983 Min. :24.47
## 1st Qu.:134.30 1st Qu.:39101 1st Qu.:0.4334 1st Qu.:26.06
## Median :160.80 Median :49402 Median :0.6133 Median :26.82
## Mean :173.58 Mean :50028 Mean :0.5937 Mean :27.00
## 3rd Qu.:195.19 3rd Qu.:55651 3rd Qu.:0.6862 3rd Qu.:27.59
## Max. :317.76 Max. :88265 Max. :0.8637 Max. :32.47
## Grain_yield_gross Grain_yield Sink_capacity Sink_filling_rate
## Min. : 583.3 Min. :299.2 Min. : 689.4 Min. :0.4914
## 1st Qu.: 809.9 1st Qu.:523.4 1st Qu.:1134.9 1st Qu.:0.5867
## Median : 953.5 Median :716.7 Median :1282.7 Median :0.7408
## Mean : 944.3 Mean :653.5 Mean :1350.0 Mean :0.7274
## 3rd Qu.:1122.0 3rd Qu.:795.7 3rd Qu.:1588.8 3rd Qu.:0.8444
## Max. :1207.8 Max. :990.8 Max. :2409.1 Max. :0.9386
## Dry_weight_stems_leaves Harvest_index
## Min. : 713.3 Min. :0.2569
## 1st Qu.: 874.7 1st Qu.:0.5143
## Median : 951.1 Median :0.5444
## Mean : 996.0 Mean :0.5284
## 3rd Qu.:1043.3 3rd Qu.:0.5847
## Max. :1984.4 Max. :0.6348
いくつかの変数が誤って数値データとして扱われている。それらを因子として変換を行う。
df <- df %>%
mutate(Plot = factor(Plot), Year = factor(Year), Rep = factor(Rep))
summary(df)
## Plot Year Rep Fertilizer Variety GrowSta_N_stems
## 1 : 1 2023:24 1:8 High_N:12 Hokuriku193:6 Min. :185.2
## 2 : 1 2:8 Low_N :12 Koshihikari:6 1st Qu.:246.3
## 3 : 1 3:8 Momiroman :6 Median :311.1
## 4 : 1 Tachiayaka :6 Mean :323.8
## 5 : 1 3rd Qu.:392.6
## 6 : 1 Max. :555.6
## (Other):18
## GrowSta_Plant_height GrowSta_SPAD N_panicles N_grains_per_panicle
## Min. :30.07 Min. :35.53 Min. :218.5 Min. : 94.71
## 1st Qu.:35.48 1st Qu.:38.41 1st Qu.:261.1 1st Qu.:134.30
## Median :41.38 Median :40.42 Median :277.8 Median :160.80
## Mean :41.79 Mean :41.07 Mean :295.8 Mean :173.58
## 3rd Qu.:46.02 3rd Qu.:43.14 3rd Qu.:326.9 3rd Qu.:195.19
## Max. :57.60 Max. :51.60 Max. :414.8 Max. :317.76
##
## N_grains_total Ripening_rate Thousand_grain_weight Grain_yield_gross
## Min. :25257 Min. :0.2983 Min. :24.47 Min. : 583.3
## 1st Qu.:39101 1st Qu.:0.4334 1st Qu.:26.06 1st Qu.: 809.9
## Median :49402 Median :0.6133 Median :26.82 Median : 953.5
## Mean :50028 Mean :0.5937 Mean :27.00 Mean : 944.3
## 3rd Qu.:55651 3rd Qu.:0.6862 3rd Qu.:27.59 3rd Qu.:1122.0
## Max. :88265 Max. :0.8637 Max. :32.47 Max. :1207.8
##
## Grain_yield Sink_capacity Sink_filling_rate Dry_weight_stems_leaves
## Min. :299.2 Min. : 689.4 Min. :0.4914 Min. : 713.3
## 1st Qu.:523.4 1st Qu.:1134.9 1st Qu.:0.5867 1st Qu.: 874.7
## Median :716.7 Median :1282.7 Median :0.7408 Median : 951.1
## Mean :653.5 Mean :1350.0 Mean :0.7274 Mean : 996.0
## 3rd Qu.:795.7 3rd Qu.:1588.8 3rd Qu.:0.8444 3rd Qu.:1043.3
## Max. :990.8 Max. :2409.1 Max. :0.9386 Max. :1984.4
##
## Harvest_index
## Min. :0.2569
## 1st Qu.:0.5143
## Median :0.5444
## Mean :0.5284
## 3rd Qu.:0.5847
## Max. :0.6348
##
まずは、散布図を描いてデータをながめてみる。
colnames(df)
## [1] "Plot" "Year"
## [3] "Rep" "Fertilizer"
## [5] "Variety" "GrowSta_N_stems"
## [7] "GrowSta_Plant_height" "GrowSta_SPAD"
## [9] "N_panicles" "N_grains_per_panicle"
## [11] "N_grains_total" "Ripening_rate"
## [13] "Thousand_grain_weight" "Grain_yield_gross"
## [15] "Grain_yield" "Sink_capacity"
## [17] "Sink_filling_rate" "Dry_weight_stems_leaves"
## [19] "Harvest_index"
まずは、生育ステージのデータ(GrowSta_で始まる変数)だけで、確認してみる。
pairs(df[, 6:8],
col = df$Variety,
pch = as.numeric(df$Fertilizer),
oma = c(3, 3, 3, 15))
par(xpd = TRUE)
legend("topright",
legend = levels(df$Variety),
col = 1:nlevels(df$Variety),
pch = 1)
symbol_map <- c("circle", "square")
plot_ly(data = df,
x = ~GrowSta_N_stems,
y = ~GrowSta_Plant_height,
z = ~GrowSta_SPAD,
color = ~Variety,
symbol = ~Fertilizer,
symbols = symbol_map,
type = "scatter3d",
mode = "markers",
marker = list(size = 5))
収穫時の形質のうち約半数を確認する。
pairs(df[, 9:14],
col = df$Variety,
pch = as.numeric(df$Fertilizer))
収穫時の形質のうち残りを確認する。
pairs(df[, 15:19],
col = df$Variety,
pch = as.numeric(df$Fertilizer))
収穫時の形質は次元が高すぎて把握が難しい。そこで主成分分析で要約してみる。計測尺度が異なるので必ず scale = TRUE とする。
res <- prcomp(df[, 6:19], scale = TRUE)
主成分の寄与率を確認する。
plot(res, xlab = "PC")
寄与率で表す。
barplot(res$sdev^2 / sum(res$sdev^2),
xlab = "PC", ylab = "Contribution")
散布図を描く
pairs(res$x[,1:4],
col = df$Variety,
pch = as.numeric(df$Fertilizer))
biplotを描いて、主成分の意味を確認する。
biplot(res)
biplotでは点の形状や色を変えられず、その点の属性がわからない。そこで、ラベルの文字を変えてみる。
vf <- paste0(substr(df$Variety, 1, 1),
substr(df$Fertilizer, 1, 1))
biplot(res, xlabs = vf,
xlim = c(-0.5, 0.5),
ylim = c(-0.5, 0.5), cex = 0.8)
主成分ごとに箱ひげ図を描いてみる。
for(i in 1:4) {
boxplot(res$x[, i] ~ vf,
xlab = "Variety:Fertilizer",
ylab = paste0("PC", i))
}
解析する形質を定める
colnames(df)
## [1] "Plot" "Year"
## [3] "Rep" "Fertilizer"
## [5] "Variety" "GrowSta_N_stems"
## [7] "GrowSta_Plant_height" "GrowSta_SPAD"
## [9] "N_panicles" "N_grains_per_panicle"
## [11] "N_grains_total" "Ripening_rate"
## [13] "Thousand_grain_weight" "Grain_yield_gross"
## [15] "Grain_yield" "Sink_capacity"
## [17] "Sink_filling_rate" "Dry_weight_stems_leaves"
## [19] "Harvest_index"
target <- "Grain_yield"
dt <- df %>% select(Year, Rep, Fertilizer, Variety) %>%
mutate(y = df[, target])
head(dt)
## Year Rep Fertilizer Variety y
## 1 2023 1 Low_N Tachiayaka 713.7046
## 2 2023 1 Low_N Momiroman 544.6303
## 3 2023 1 Low_N Hokuriku193 990.7985
## 4 2023 1 Low_N Koshihikari 750.4786
## 5 2023 1 High_N Hokuriku193 795.3247
## 6 2023 1 High_N Momiroman 524.4486
精籾収量について、品種ごとの平均を計算する。
VarMean <- tapply(dt$y, dt$Variety, mean)
VarMean
## Hokuriku193 Koshihikari Momiroman Tachiayaka
## 821.8015 615.7702 664.2796 512.3007
施肥水準ごとの平均を計算する。
FertMean <- tapply(dt$y, dt$Fertilizer, mean)
FertMean
## High_N Low_N
## 661.1148 645.9612
繰り返し(ブロック)ごとの平均を計算する。
RepMean <- tapply(dt$y, dt$Rep, mean)
RepMean
## 1 2 3
## 622.4273 632.3664 705.8204
品種と施肥水準の組合せごとの平均を計算する。
VarFertMean <- tapply(dt$y,
dt$Variety:dt$Fertilizer,
mean)
VarFertMean
## Hokuriku193:High_N Hokuriku193:Low_N Koshihikari:High_N Koshihikari:Low_N
## 799.0363 844.5666 653.5172 578.0231
## Momiroman:High_N Momiroman:Low_N Tachiayaka:High_N Tachiayaka:Low_N
## 670.8348 657.7244 521.0709 503.5305
品種と施肥水準を図示するために一度行列としてまとめる。
vf <- matrix(VarFertMean, nrow = 2)
vf
## [,1] [,2] [,3] [,4]
## [1,] 799.0363 653.5172 670.8348 521.0709
## [2,] 844.5666 578.0231 657.7244 503.5305
行と列に名前をつける。
rownames(vf) <- levels(dt$Fertilizer)
colnames(vf) <- levels(dt$Variety)
vf
## Hokuriku193 Koshihikari Momiroman Tachiayaka
## High_N 799.0363 653.5172 670.8348 521.0709
## Low_N 844.5666 578.0231 657.7244 503.5305
matplot関数を使って図示する。
matplot(vf, type = "b") # type = "b"は点と線の両方を描く
わかりやすいように軸のタイトル、ラベル、凡例をつける。
matplot(vf, type = "b",
pch = 1, ylim = c(0, max(vf)), xaxt = "n",
xlab = "Fertilizer",
ylab = target)
axis(1, at = 1:2, labels = rownames(vf))
legend("bottomright", legend = colnames(vf),
pch = 1, col = 1:4, cex = 1)
品種と施肥水準を逆にして棒グラフで図示してみる。
barplot(
vf,
beside = TRUE, # 並べて描画
col = c("skyblue", "orange"),# 棒の色
legend.text = TRUE, # 凡例を表示
args.legend = list(x = "bottomright"), # 凡例の位置
xlab = "Variety", # x軸ラベル
ylab = target # y軸ラベル
)
分割区法分散分析のRでの実行は多少複雑である。一次因子の施肥水準と、二次因子の品種の効果、およびそれら交互作用を検定するが、一次因子の効果は一次誤差で、二次因子の効果と一次因子と二次因子の交互作用は二次誤差で検定される必要がある。
res <- aov(y ~
Fertilizer * Variety +
Error(Rep/Fertilizer),
data = dt)
summary(res)
##
## Error: Rep
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 2 33196 16598
##
## Error: Rep:Fertilizer
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizer 1 1378 1378 0.012 0.921
## Residuals 2 220587 110293
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## Variety 3 298814 99605 4.459 0.0253 *
## Fertilizer:Variety 3 11000 3667 0.164 0.9185
## Residuals 12 268062 22339
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Rでは計算されないが、計算されている平均平方を用いて、反復間の差に対する検定も行うことができる。
# 反復のF値とp値
tmp <- summary(res)
(mss1 <- tmp$`Error: Rep`[[1]][1,3])
## [1] 16598.24
(mss2 <- tmp$`Error: Rep:Fertilizer`[[1]][2,3])
## [1] 110293.4
(df1 <- tmp$`Error: Rep`[[1]][1,1])
## [1] 2
(df2 <- tmp$`Error: Rep:Fertilizer`[[1]][2,1])
## [1] 2
fv_rep <- mss1/mss2; fv_rep
## [1] 0.1504917
1 - pf(fv_rep, df1, df2)
## [1] 0.8691936
2023年度の精籾収量の分散分析表は以下のようにまとめられる。
要因 | 自由度 | 平方和 | 平均平方 | F 値 | p 値 | |
---|---|---|---|---|---|---|
反復 | 2 | 33196 | 16598 | 0.150 | 0.869 | |
施肥(1次) | 1 | 1378 | 1378 | 0.012 | 0.921 | |
1次誤差 | 2 | 220587 | 110293 | |||
品種(2次) | 3 | 298814 | 99605 | 4.459 | 0.0253 | * |
施肥・品種交互作用 | 3 | 11000 | 3667 | 0.164 | 0.919 | |
2次誤差 | 12 | 2680622 | 22339 | |||
2023年度の収量の分散分析では、一次因子である施肥効果は認められない。また、二次因子の品種効果は認められるが、施肥・品種の交互作用は認められない。これは、グラフをみると「北陸193号」以外は高窒素区で収量が上昇していたが、その効果は顕著でなかった。一方、品種間で大きな差があるのは明らかであった。交互作用は、4品種が高窒素区・低窒素区間で順位も変わらず、有意性は認められなかった。
複数の形質から計算される主成分得点について、品種や処理の効果を含めた分散分析を行うこともできる。まず、データを準備する。
res <- prcomp(df[, 6:19], scale = TRUE)
target <- 1
dt <- df %>% select(Year, Rep, Fertilizer, Variety) %>%
mutate(y = res$x[,target])
head(dt)
## Year Rep Fertilizer Variety y
## 1 2023 1 Low_N Tachiayaka 1.0183418
## 2 2023 1 Low_N Momiroman -2.8848191
## 3 2023 1 Low_N Hokuriku193 0.3037691
## 4 2023 1 Low_N Koshihikari -0.6277118
## 5 2023 1 High_N Hokuriku193 -1.1624640
## 6 2023 1 High_N Momiroman -2.0189045
res <- aov(y ~
Fertilizer * Variety +
Error(Rep/Fertilizer),
data = dt)
summary(res)
##
## Error: Rep
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 2 2.187 1.094
##
## Error: Rep:Fertilizer
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizer 1 0.013 0.013 0.001 0.975
## Residuals 2 20.510 10.255
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## Variety 3 83.73 27.911 13.340 0.000396 ***
## Fertilizer:Variety 3 0.69 0.232 0.111 0.952206
## Residuals 12 25.11 2.092
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
2023年度と2024年度では、施肥によって制御する対象が窒素からリンに変わった。また、2022年度と2023年度では、品種も異なる。そこで、ここでは2019年度から2022年度の圃場試験実習の結果をもとに年次効果を含めた分散分析について説明する。2019年度から2022年度では、年度ごとに配置は異なるが、同じ構造の試験であったので、年次間の比較が行うことができる。しかし、構造モデルはかなり複雑になる。
試験区のある形質の測定値を \(Y_{ijkl}\) とすると, \(Y_{ijkl}\) の統計(構造)モデルは,1 次因子水準数 \(a = 2\),2 次因子水準数 \(b = 4\),反復 \(r = 3\),年次 \(c=4\) として,
\[ Y_{ijkl} = \mu + \alpha_i + \gamma_l + (\alpha \gamma)_{il} + ( \rho\gamma)_{kl} + e_{ikl}^1 + \beta_j + (\alpha \beta)_{ij} + (\beta\gamma)_{jl} + (\alpha \beta \gamma)_{ijl} + e_{ijkl}^2, \\ i=1,\ldots,a, j=1,\ldots,b, k=1,\ldots,r, l=1,\ldots,c \] とおける.ただし,\(\mu\) は総平均,\(\alpha_i\) は施肥効果,\(\gamma_l\) は年次効果,\((\alpha\gamma)_{il}\) は 施肥と年次の交互作用,\((\rho\gamma)_{kl}\) はブロック効果で、年次でブロックが異なるので交互作用の形で取り出した。\(\beta_j\) は品種効果,\((\alpha\beta)_{ij}\) は 施肥と品種の交互作用,\((\beta\gamma)_{jl}\) は 品種と年次の交互作用,\(e_{ikl}^1\) は 1 次誤差、\(e_{ijkl}^2\) は 2 次誤差、\((\alpha\beta\gamma)_{ijl}\) は 施肥と品種と年次の3次交互作用である。ブロック効果は年次をまたいで取り出すことはできないので、年次とブロックの交互作用として取り出し、\(\rho\gamma_{kl} \sim N(0, \sigma_B^2)\) を満たす変量(確率変数)とした。誤差は,\(e_{ikl}^1 \sim N(0, \sigma^2_1)\)、\(e^2_{ijkl} \sim N(0, \sigma^2_2)\) を満たす互いに独立な変量であるとした。
2019年から2022年度のデータを読み込み、品種・施肥水準・年次の組合せごとに平均を求めて視覚化する。
re19.22 <- read.csv("riceexp19to22.csv")
re19.22 <- re19.22 %>% mutate(Plot = factor(Plot),
Year = factor(Year),
Rep = factor(Rep),
Fertilizer = factor(Fertilizer),
Variety = factor(Variety))
summary(re19.22)
## Plot Year Rep Fertilizer Variety N_panicles
## 1 : 4 2019:24 1:32 High_N:48 Calotoc :24 Min. :124.4
## 2 : 4 2020:24 2:32 Low_N :48 Momiroman :24 1st Qu.:177.2
## 3 : 4 2021:24 3:32 Teqing :24 Median :200.0
## 4 : 4 2022:24 Yamadawara:24 Mean :207.8
## 5 : 4 3rd Qu.:233.3
## 6 : 4 Max. :304.4
## (Other):72
## Grain_yield Dry_weight_stems_leaves Harvest_index
## Min. : 78.35 Min. : 792.1 Min. :0.04213
## 1st Qu.:341.33 1st Qu.:1176.4 1st Qu.:0.24354
## Median :524.17 Median :1361.3 Median :0.35311
## Mean :504.61 Mean :1359.3 Mean :0.34169
## 3rd Qu.:664.38 3rd Qu.:1520.0 3rd Qu.:0.45123
## Max. :900.13 Max. :1848.7 Max. :0.62020
##
target <- "Grain_yield"
dt <- re19.22 %>%
select(Year, Rep, Fertilizer, Variety) %>%
mutate(y = re19.22[, target])
head(dt)
## Year Rep Fertilizer Variety y
## 1 2022 1 Low_N Calotoc 288.0794
## 2 2022 1 Low_N Yamadawara 595.0599
## 3 2022 1 Low_N Teqing 727.3062
## 4 2022 1 Low_N Momiroman 403.6212
## 5 2022 1 High_N Momiroman 522.1633
## 6 2022 1 High_N Calotoc 278.6429
まずは、組合せごとの平均を計算する。
VarFertYearMean <- tapply(dt$y,
dt$Variety:dt$Fertilizer:dt$Year,
mean)
VarFertYearMean
## Calotoc:High_N:2019 Calotoc:High_N:2020 Calotoc:High_N:2021
## 353.1543 379.2207 114.1943
## Calotoc:High_N:2022 Calotoc:Low_N:2019 Calotoc:Low_N:2020
## 256.4652 325.8597 286.2260
## Calotoc:Low_N:2021 Calotoc:Low_N:2022 Momiroman:High_N:2019
## 167.9413 279.3851 311.4990
## Momiroman:High_N:2020 Momiroman:High_N:2021 Momiroman:High_N:2022
## 508.2113 379.5093 571.3807
## Momiroman:Low_N:2019 Momiroman:Low_N:2020 Momiroman:Low_N:2021
## 353.3203 697.1863 575.9860
## Momiroman:Low_N:2022 Teqing:High_N:2019 Teqing:High_N:2020
## 448.8584 637.1487 737.8623
## Teqing:High_N:2021 Teqing:High_N:2022 Teqing:Low_N:2019
## 455.7623 825.4517 548.0263
## Teqing:Low_N:2020 Teqing:Low_N:2021 Teqing:Low_N:2022
## 767.2623 403.4193 761.7230
## Yamadawara:High_N:2019 Yamadawara:High_N:2020 Yamadawara:High_N:2021
## 658.2533 648.7797 454.7887
## Yamadawara:High_N:2022 Yamadawara:Low_N:2019 Yamadawara:Low_N:2020
## 704.8038 666.3393 667.6717
## Yamadawara:Low_N:2021 Yamadawara:Low_N:2022
## 566.1410 635.7732
行列のかたちにする。
vfy <- matrix(VarFertYearMean, nrow = 4)
rownames(vfy) <- levels(dt$Year)
colnames(vfy) <- levels(dt$Variety:dt$Fertilizer)
vfy
## Calotoc:High_N Calotoc:Low_N Momiroman:High_N Momiroman:Low_N
## 2019 353.1543 325.8597 311.4990 353.3203
## 2020 379.2207 286.2260 508.2113 697.1863
## 2021 114.1943 167.9413 379.5093 575.9860
## 2022 256.4652 279.3851 571.3807 448.8584
## Teqing:High_N Teqing:Low_N Yamadawara:High_N Yamadawara:Low_N
## 2019 637.1487 548.0263 658.2533 666.3393
## 2020 737.8623 767.2623 648.7797 667.6717
## 2021 455.7623 403.4193 454.7887 566.1410
## 2022 825.4517 761.7230 704.8038 635.7732
matplot関数でグラフを描く。
matplot(vfy, type = "b")
軸タイトル、目盛り、凡例を加えて、再度描く。
matplot(vfy, type = "b", pch = 1:2,
col = rep(1:7, each = 2), lty = 1:2,
ylim = c(0, max(vfy)), xaxt = "n",
xlab = "Year", ylab = "Yield", )
axis(1, 1:nrow(vfy), labels = rownames(vfy))
legend("bottomright", legend = levels(dt$Variety),
lty = 1, col = 1:7, cex = 0.7)
legend("bottomleft", legend = levels(dt$Fertilizer),
lty = 1:2, pch = 1:2, cex = 0.7)
年次にもよるが、施肥水準による効果は、年次の効果や、品種の効果に比べると、あまり顕著ではない。
ここからは、今年度のデータを除いて、分散分析を行ってみる。
年次効果も含めた分割区法分散分析を行う。
res <- aov(y ~ Year * Fertilizer * Variety
+ Error((Year + Year:Rep)/Fertilizer),
data = dt)
summary(res)
##
## Error: Year
## Df Sum Sq Mean Sq
## Year 3 565467 188489
##
## Error: Year:Rep
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 8 91900 11487
##
## Error: Year:Rep:Fertilizer
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizer 1 2242 2242 0.392 0.5486
## Year:Fertilizer 3 63329 21110 3.693 0.0619 .
## Residuals 8 45733 5717
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Error: Within
## Df Sum Sq Mean Sq F value Pr(>F)
## Variety 3 2134493 711498 138.916 < 2e-16 ***
## Year:Variety 9 415933 46215 9.023 8.12e-08 ***
## Fertilizer:Variety 3 46689 15563 3.039 0.0379 *
## Year:Fertilizer:Variety 9 93357 10373 2.025 0.0567 .
## Residuals 48 245845 5122
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Rでは計算されないが、反復間の差や年次に対する検定も可能である。
tmp <- summary(res)
(mss1 <- tmp[[1]][[1]][1,3])
## [1] 188489.1
(mss2 <- tmp[[3]][[1]][3,3])
## [1] 5716.584
(df1 <- tmp[[1]][[1]][1,1])
## [1] 3
(df2 <- tmp[[3]][[1]][3,1])
## [1] 8
fv_year <- mss1/mss2; fv_year
## [1] 32.97232
1 - pf(fv_year, df1, df2)
## [1] 7.479304e-05
(mss1 <- tmp[[2]][[1]][1,3])
## [1] 11487.47
(mss2 <- tmp[[3]][[1]][3,3])
## [1] 5716.584
(df1 <- tmp[[2]][[1]][1,1])
## [1] 8
(df2 <- tmp[[3]][[1]][3,1])
## [1] 8
fv_yearrep <- mss1/mss2; fv_yearrep
## [1] 2.009498
1 - pf(fv_yearrep, df1, df2)
## [1] 0.1716843
2019~2022年度の収量の分散分析表は以下のようにまとめられる。
要因 | 自由度 | 平方和 | 平均平方 | F 値 | p 値 | |
---|---|---|---|---|---|---|
年次 | 3 | 565467 | 188489 | 32.97 | 7e-15 | *** |
反復(年次) | 8 | 91900 | 11487 | 2.009 | 0.172 | |
施肥(1次) | 1 | 2242 | 2242 | 0.392 | 0.5486 | |
施肥・年次交互作用 | 3 | 63329 | 21110 | 3.693 | 0.0619 | . |
1次誤差 | 8 | 45733 | 5717 | |||
品種(2次) | 3 | 2134493 | 711498 | 138.916 | < 2e-16 | *** |
品種・年次交互作用 | 9 | 415933 | 46215 | 9.023 | 8.12e-08 | *** |
施肥・品種交互作用 | 3 | 46689 | 15563 | 3.039 | 0.0379 | * |
施肥・品種・年次3次交互作用 | 9 | 93357 | 10373 | 2.025 | 0.0567 | . |
2次誤差 | 48 | 245845 | 5122 | |||
施肥効果は認められなかったが、品種効果、品種・年次交互作用、施肥・品種交互作用が認められた。3次交互作用は微妙だが認められなかった。交互作用が認められた組のグラフを描く。
まず、年次と品種の組合せごとに平均を求める。
VarYear <- tapply(dt$y,
dt$Variety:dt$Year,
mean)
head(VarYear)
## Calotoc:2019 Calotoc:2020 Calotoc:2021 Calotoc:2022 Momiroman:2019
## 339.5070 332.7233 141.0678 267.9251 332.4097
## Momiroman:2020
## 602.6988
行列のかたちにする。
vy <- matrix(VarYear, nrow = 4)
rownames(vy) <- levels(dt$Year)
colnames(vy) <- levels(dt$Variety)
vy
## Calotoc Momiroman Teqing Yamadawara
## 2019 339.5070 332.4097 592.5875 662.2963
## 2020 332.7233 602.6988 752.5623 658.2257
## 2021 141.0678 477.7477 429.5908 510.4648
## 2022 267.9251 510.1195 793.5874 670.2885
図示する。
matplot(vy, type = "b", pch = 1, lty = 1, col = 1:4,
ylim = c(0, max(vy)), xaxt = "n",
xlab = "Year", ylab = "Yield", )
axis(1, 1:4, labels = rownames(vy))
legend("bottomleft", legend = colnames(vy),
pch = 1, col = 1:4, cex = 0.8)
品種と施肥水準の組合せごとに平均を求める。
VarFertMean <- tapply(dt$y,
dt$Variety:dt$Fertilizer,
mean)
head(VarFertMean)
## Calotoc:High_N Calotoc:Low_N Momiroman:High_N Momiroman:Low_N
## 275.7586 264.8530 442.6501 518.8378
## Teqing:High_N Teqing:Low_N
## 664.0563 620.1077
行列の形にする。
vf <- matrix(VarFertMean, nrow = 2)
rownames(vf) <- levels(dt$Fertilizer)
colnames(vf) <- levels(dt$Variety)
vf
## Calotoc Momiroman Teqing Yamadawara
## High_N 275.7586 442.6501 664.0563 616.6564
## Low_N 264.8530 518.8378 620.1077 633.9813
図示する。
matplot(vf, type = "b", pch = 1, lty = 1, col = 1:4,
ylim = c(0, max(vf)), xaxt = "n",
xlab = "Fertilizer", ylab = "Yield", )
axis(1, 1:2, labels = rownames(vf))
legend("bottomleft", legend = colnames(vf),
pch = 1, col = 1:4, cex = 0.7)
重回帰を用いて、生育期の形質と成熟期の形質間にどのような関係があるかを解析してみる。
重回帰分析を用いて、精籾収量を生育期の形質に回帰するモデルを作成する。
model <- lm(Grain_yield ~
GrowSta_N_stems + GrowSta_Plant_height + GrowSta_SPAD,
data = df)
summary(model)
##
## Call:
## lm(formula = Grain_yield ~ GrowSta_N_stems + GrowSta_Plant_height +
## GrowSta_SPAD, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -247.42 -143.33 23.64 84.56 251.51
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 719.0750 375.8505 1.913 0.07015 .
## GrowSta_N_stems -0.1791 0.3774 -0.475 0.64015
## GrowSta_Plant_height -17.7069 5.8629 -3.020 0.00676 **
## GrowSta_SPAD 17.8323 10.5796 1.686 0.10742
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.3 on 20 degrees of freedom
## Multiple R-squared: 0.4208, Adjusted R-squared: 0.3339
## F-statistic: 4.843 on 3 and 20 DF, p-value: 0.01081
草丈の効果が高度に有意であることがわかる。
しかし、用いられた品種には草丈の違いがあり、4品種がたまたまもつ草丈の違いが収量と関連しただけかもしれない。そこで、先に行った分散分析のモデルと重回帰モデルを融合して、草丈の有意性を確認することにする。
まず、先に行った分散分析と同じ構造をもつ回帰モデルを構築する。一次因子の誤差は、ここでは、施肥水準と反復の交互作用(Fertilizer:Rep)である。実際には、施肥水準と反復の主効果の検定は、施肥水準と反復の交互作用を誤差として行わなければならないことに注意する。
model <- lm(Grain_yield ~
Fertilizer + Variety + Rep +
Rep:Fertilizer + Fertilizer:Variety,
data = df)
anova(model)
## Analysis of Variance Table
##
## Response: Grain_yield
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizer 1 1378 1378 0.0617 0.80806
## Variety 3 298814 99605 4.4589 0.02526 *
## Rep 2 33196 16598 0.7430 0.49634
## Fertilizer:Rep 2 220587 110293 4.9374 0.02725 *
## Fertilizer:Variety 3 11000 3667 0.1641 0.91846
## Residuals 12 268062 22339
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
上のモデルに、先の重回帰モデルを融合する。
model <- lm(Grain_yield ~
Fertilizer + Variety + Rep +
Rep:Fertilizer + Fertilizer:Variety +
GrowSta_N_stems + GrowSta_Plant_height + GrowSta_SPAD,
data = df)
anova(model)
## Analysis of Variance Table
##
## Response: Grain_yield
## Df Sum Sq Mean Sq F value Pr(>F)
## Fertilizer 1 1378 1378 0.0718 0.79472
## Variety 3 298814 99605 5.1935 0.02353 *
## Rep 2 33196 16598 0.8654 0.45314
## GrowSta_N_stems 1 138113 138113 7.2013 0.02506 *
## GrowSta_Plant_height 1 48816 48816 2.5453 0.14509
## GrowSta_SPAD 1 2711 2711 0.1413 0.71566
## Fertilizer:Rep 2 118607 59303 3.0921 0.09502 .
## Fertilizer:Variety 3 18793 6264 0.3266 0.80631
## Residuals 9 172609 19179
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
生育期の草丈は有意でなく、先ほどのモデルでは有意でなかった生育期の茎数が5%水準で有意であることがわかる。
効果の向きを確認する。
coef(model)
## (Intercept) FertilizerLow_N
## 829.1611277 211.8852954
## VarietyKoshihikari VarietyMomiroman
## -29.3960706 -161.1714698
## VarietyTachiayaka Rep2
## -100.0674499 217.9012924
## Rep3 GrowSta_N_stems
## 134.5907079 -0.3426436
## GrowSta_Plant_height GrowSta_SPAD
## -16.9998249 15.1060247
## FertilizerLow_N:Rep2 FertilizerLow_N:Rep3
## -363.4028493 -139.2355250
## FertilizerLow_N:VarietyKoshihikari FertilizerLow_N:VarietyMomiroman
## -168.3527995 -93.2544689
## FertilizerLow_N:VarietyTachiayaka
## -72.2696723
生育期の茎数の回帰係数は負であり、茎数が多くなるほど、精籾収量は低下すると考えられる。