Итак, это ваши данные:
x = structure(list(Trees = structure(c(1L, 12L, 14L, 15L, 16L, 17L,
18L, 19L, 20L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 13L), .Label = c("Tree_1",
"Tree_10", "Tree_11", "Tree_12", "Tree_13", "Tree_14", "Tree_15",
"Tree_16", "Tree_17", "Tree_18", "Tree_19", "Tree_2", "Tree_20",
"Tree_3", "Tree_4", "Tree_5", "Tree_6", "Tree_7", "Tree_8", "Tree_9"
), class = "factor"), Avg_number_1m = c(15.2, 16.2, 14.4, 14.6,
15.2, 14, 13.8, 10.8, 12.4, 15.6, 7.6, 13.8, 10.8, 15.2, 16.2,
12.4, 14.6, 15.2, 14, 11), Avg_number_2m = c(15, 15.4, 9.2, 5.6,
13, 12, 7.8, 5.8, 9.6, 11, 7.4, 7.8, 5.8, 15, 15.4, 9.2, 5.6,
13, 14.4, 5.2), Avg_number_3m = c(15.2, 14.2, 3.2, 10.4, 7.4,
13, 7.2, 4.4, 6.8, 7.2, 9, 7.2, 4.4, 15.2, 14.2, 3.2, 10.4, 7.4,
13.2, 4.4), Avg_number_4m = c(12, 15.4, 1.6, 9.2, 3, 11.2, 2,
2.4, 2.6, 1.8, 1.8, 2, 1.6, 12, 15, 1.6, 9.2, 3, 13.8, 0.8)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17", "18", "19", "20"))
Мы можем очень быстро визуализировать ваши данные с помощью boxplot, и это показывает, что на больших высотах меньше колючек:
![enter image description here](https://i.stack.imgur.com/cD2B9.png)
Итак, мы загружаем несколько библиотек, чтобы получить данные в правильной форме:
library(ggplot2)
library(tidyr)
# first we make it a "long" format
df = pivot_longer(x,-Trees,names_to="Height_levels")
Теперь мы визуализируем для каждого отдельного дерева, как оно выглядит:
ggplot(df,aes(x=Height_levels,y=value,col=Trees)) + geom_point() +
geom_line(aes(group=Trees)) + theme(legend.position="top")
![enter image description here](https://i.stack.imgur.com/U266um.png)
Это говорит нам о двух вещах: нам нужно настроить дерево, а затем проверить, когда существуют различия между высотами, наиболее прямым является используйте anova для проверки:
aovfit = aov(value ~ Trees + Height_levels,data=df)
summary(aovfit)
Df Sum Sq Mean Sq F value Pr(>F)
Trees 19 877.9 46.20 7.692 8.98e-10 ***
Height_levels 3 588.9 196.31 32.682 2.02e-12 ***
Residuals 57 342.4 6.01
и post-ho c с Тьюки:
posthoc = TukeyHSD(aovfit)
posthoc$Height_levels
diff lwr upr p adj
Avg_number_2m-Avg_number_1m -3.49 -5.54109 -1.4389103 1.930647e-04
Avg_number_3m-Avg_number_1m -4.77 -6.82109 -2.7189103 4.752523e-07
Avg_number_4m-Avg_number_1m -7.55 -9.60109 -5.4989103 1.182687e-11
Avg_number_3m-Avg_number_2m -1.28 -3.33109 0.7710897 3.586375e-01
Avg_number_4m-Avg_number_2m -4.06 -6.11109 -2.0089103 1.429319e-05
Avg_number_4m-Avg_number_3m -2.78 -4.83109 -0.7289103 3.779450e-03
Если вы хотите, вы также можете установить линейную модель, где высота является непрерывной переменной, и протестируйте ее с помощью anova:
df$Height = as.numeric(gsub("[^0-9]","",as.character(df$Height_levels)))
aov_continuous = aov(value ~ Trees + Height,data=df)
summary(aov_continuous)
Df Sum Sq Mean Sq F value Pr(>F)
Trees 19 877.9 46.2 7.601 7.74e-10 ***
Height 1 572.6 572.6 94.199 7.78e-14 ***
Residuals 59 358.7 6.1
И коэффициенты подскажут, сколько в среднем вы получите меньших шипов, поднявшись на 1 м. В данном случае это около -2,39 ..
aov_continuous$coefficients
[...]
Height
-2.393000e+00