У меня есть фрейм данных с переменной важностью для 4 переменных в 10 выборках (Fold01, Fold02 и т. д.) для 3 классов (столбцов). Мне нужен фрейм данных, который вычисляет совокупное среднее значение и стандартное отклонение по сгибам для каждой переменной, в результате чего получается 4 строки. Затем я хотел бы построить средние значения и планки ошибок для каждого класса/вида. Буду очень благодарен за помощь.
> dput(importance_df2)
structure(list(setosa = c(8.20355609194933, 5.15249911622198,
13.9558863013725, 15.2128507245513, 14.2287841553551, 1.51099471303875,
14.1741359032028, 12.5576190653829, 12.7135584510845, 1.63263917927766,
13.1206666145443, 12.184133136283, 12.794551602574, 3.32611050072169,
12.1568044940333, 13.662063280372, 8.03308199276954, -1.10566445521712,
15.6069320089807, 13.9645321784155, 6.80447069712796, 9.3523987791519,
12.1282981646457, 12.6980178576138, 5.05449196196674, 8.36182912000269,
13.776929730243, 13.2942285027714, 11.0813984016604, 4.9605895727141,
12.0039375765177, 12.3734970858531, 5.98547101050249, 9.36005244631558,
13.3434619850693, 13.3619015895155, 5.57715669965123, 5.91335297168266,
14.7795763793108, 13.9430150789271), versicolor = c(-1.7002694195893,
3.06911291029383, 11.5092164162373, 11.2528327233939, 7.69343208447305,
-1.17756934401283e-16, 10.9209890906177, 11.7609136729957, 6.70639738269152,
0.760725774312731, 9.48740581370106, 12.2175825329555, 6.6958363476924,
-0.568258374571754, 11.3820406468415, 8.36469021380585, -2.56633828664633,
0.30863609523786, 12.70735779349, 10.1690080282048, -2.34618159209803,
5.85759172926667, 7.26861212538479, 8.13139740949972, 1.11527282794308,
5.41805836349278, 9.75695989109409, 12.1801573691389, 1.57083966687311,
-0.72799238491593, 5.25415187946201, 8.43460590077721, -1.41609558278021,
5.27752925941252, 14.1691762122916, 10.3601897701751, -0.37010471286716,
5.86816454137302, 10.4962595111475, 10.4105932209458), virginica = c(2.95093458552127,
-1.85802151725244, 14.4334119763945, 15.6277402157776, 8.17755144643701,
0.690058853263635, 15.854316157953, 14.7114006700544, 5.85078053147856,
-1.6706499415125, 14.0279702227116, 15.7554751132441, 9.40484079015884,
-1.2401814464269, 15.1239238118373, 9.07920704347448, 6.50694006432927,
-0.230186330684734, 16.0277589532947, 15.7679761862469, 2.47594955398933,
0.17408293127597, 13.5353271980825, 11.5562954214589, 5.40365512424528,
-1.73727046020804, 13.0804445714249, 13.8353978705698, 7.20354680090468,
-1.35268412835237, 10.9238912568498, 10.727891285877, 3.82785295202544,
0.221508441183689, 18.0183887569268, 10.1872583455874, 2.12449925682884,
-0.794798604577416, 13.2737225375695, 14.7611944191273)), row.names = c("Fold01.Sepal.Length",
"Fold01.Sepal.Width", "Fold01.Petal.Length", "Fold01.Petal.Width",
"Fold02.Sepal.Length", "Fold02.Sepal.Width", "Fold02.Petal.Length",
"Fold02.Petal.Width", "Fold03.Sepal.Length", "Fold03.Sepal.Width",
"Fold03.Petal.Length", "Fold03.Petal.Width", "Fold04.Sepal.Length",
"Fold04.Sepal.Width", "Fold04.Petal.Length", "Fold04.Petal.Width",
"Fold05.Sepal.Length", "Fold05.Sepal.Width", "Fold05.Petal.Length",
"Fold05.Petal.Width", "Fold06.Sepal.Length", "Fold06.Sepal.Width",
"Fold06.Petal.Length", "Fold06.Petal.Width", "Fold07.Sepal.Length",
"Fold07.Sepal.Width", "Fold07.Petal.Length", "Fold07.Petal.Width",
"Fold08.Sepal.Length", "Fold08.Sepal.Width", "Fold08.Petal.Length",
"Fold08.Petal.Width", "Fold09.Sepal.Length", "Fold09.Sepal.Width",
"Fold09.Petal.Length", "Fold09.Petal.Width", "Fold10.Sepal.Length",
"Fold10.Sepal.Width", "Fold10.Petal.Length", "Fold10.Petal.Width"
), class = "data.frame")
Как создать фрейм данных, который представляет собой среднее значение и стандартное отклонение каждой из 4 переменных по сгибам, например, создать среднее значение и стандартное отклонение для Sepal.Length от Fold01.Sepal.Length до Fold10.Sepal.Length.
Имеется 4 переменные Sepal.Width, Sepal.Length, Petal.Width, Petal.Length. Каждый имеет по 10 рядов для каждой из 10 складок.
Сначала lapply над разделенным Sepal/Petal.Length/Width, затем sapplymean и sd складок. В итоге вы получите список из четырех значений, каждый из которых содержит три класса среднего и стандартного отклонения. Наконец, постройте результат.
Спасибо! Я не уверен, как их использовать. Буду очень благодарен за помощь!





Часть данных, берущая split из rownames
splt <- split(importance_df2,
sub("Fold\\d{2}\\.(.*)", "\\1", rownames(importance_df2)))
lst <- lapply(splt, \(x) sapply(x, \(y) c(mean = mean(y), sd = sd(y))))
means <- sapply(lst, \(x) x["mean",])
Построение графика с использованием базы
(полосы ошибок из значений SD не должны быть проблемой при данном начале)
barplot(means, beside=T, border=F)
График с помощью ggplot2
library(dplyr)
library(tidyr)
library(ggplot2)
as_tibble(means) %>%
mutate(class=rownames(means)) %>%
pivot_longer(-class) %>%
ggplot() +
geom_col(aes(name, value, fill=class), position=position_dodge())
Отлично! Большое спасибо!
То же самое, но другое. Я melt() перевожу данные в длинный формат перед использованием apply(). Гистограммы с тремя факторными переменными требуют небольшого обходного пути.
# splitting rownames to make grouping factors
imp <- importance_df2
imp <- cbind(do.call("rbind", strsplit(rownames(imp), "\\.")), imp)
rownames(imp) <- NULL
colnames(imp)[1:3] <- c("fold", "sep.pet", "len.wid")
# melting into long format
imp.long <- reshape2::melt(imp, 1:3, 4:6)
# aggregating
f2 <- formula(value ~ sep.pet + len.wid + variable)
imp.agg <- aggregate(f2, imp.long, \(x) c(mean=mean(x), sd=sd(x), n=length(x)))
imp.agg <- cbind(imp.agg[,-4], imp.agg$value)
# calculating upper and lower 95% CI
imp.agg <- transform(imp.agg, upper=mean+(sd/sqrt(n))*1.96, lower=mean-(sd/sqrt(n))*1.96)
# plotting with three factors by subsetting one of the factors
par(mfrow=c(1, 2), mar=c(3, 4, 3, 0.1))
ylims <- extendrange(imp.agg[, c("upper", "lower")], f=0.02)
bp1 <- barplot(mean ~ variable + len.wid, data=subset(imp.agg, sep.pet= = "Petal"),
beside=TRUE, ylim=ylims, xlab = "", main = "Petal")
points(c(upper, lower) ~ rep(c(t(bp1)), 2), data=subset(imp.agg, sep.pet= = "Petal"),
pch=rep(c(6, 2), each=length(upper)), col = "dodgerblue", cex=0.8)
bp2 <- barplot(mean ~ variable + len.wid, data=imp.agg, subset=sep.pet= = "Sepal",
beside=TRUE, yaxt = "n", ylab = "", xlab = "", ylim=ylims, main = "Sepal",
legend.text=TRUE, args.legend=list(x = "top", bty = "n", cex=0.5, horiz=TRUE))
points(c(upper, lower) ~ rep(c(t(bp1)), 2), data=subset(imp.agg, sep.pet= = "Sepal"),
pch=rep(c(6, 2), each=length(upper)), col = "dodgerblue", cex=0.8)
Это очень полезно. Большое спасибо!!
Где ты застрял?