У меня есть такие данные, как:
df1 <- read.table(text = "A1 A2 A3 A4 B1 B2 B3 B4
1 2 4 12 33 17 77 69
34 20 59 21 90 20 43 44
11 16 23 24 19 12 55 98
29 111 335 34 61 88 110 320
51 58 45 39 55 87 55 89", stringsAsFactors = FALSE, header = TRUE, row.names=c("N1","N2","N3","N4","N5"))
Я хочу сравнить значения между A
и B
по строкам.Сначала я хочу проверить, является ли распределение A
и B
нормальным распределением ks.test
.Во-вторых, я проверю, отличается ли разница между A
и B
на var.test
.Для ненормальных распределенных результатов (p ks.test <0,05) я проведу тест Уилкокса по <code>wilcox.test.Для нормальных распределенных результатов я проведу тестирование, разделив их на равные и неравные дисперсии тестирования на t.test
.Наконец, я объединяю все результаты.
Сначала я настроил пять функций ks.test
, var.test
, wilcox.test
и две t.test
:
kstest<-function(df, grp1, grp2) {
x = df[grp1]
y = df[grp2]
x = as.numeric(x)
y = as.numeric(y)
results = ks.test(x,y,alternative = c("two.sided"))
results$p.value
}
vartest<-function(df, grp1, grp2) {
x = df[grp1]
y = df[grp2]
x = as.numeric(x)
y = as.numeric(y)
results = var.test(x,y,alternative = c("two.sided"))
results$p.value
}
wilcox<-function(df, grp1, grp2) {
x = df[grp1]
y = df[grp2]
x = as.numeric(x)
y = as.numeric(y)
results = wilcox.test(x,y,alternative = c("two.sided"))
results$p.value
}
ttest_equal<-function(df, grp1, grp2) {
x = df[grp1]
y = df[grp2]
x = as.numeric(x)
y = as.numeric(y)
results = t.test(x,y,alternative = c("two.sided"),var.equal = TRUE)
results$p.value
}
ttest_unequal<-function(df, grp1, grp2) {
x = df[grp1]
y = df[grp2]
x = as.numeric(x)
y = as.numeric(y)
results = t.test(x,y,alternative = c("two.sided"),var.equal = FALSE)
results$p.value
}
Затем я вычислил значение p ks.test
и var.test
для поднабора данных:
ks_AB<-apply(df1,1,kstest,grp1=grepl("^A",colnames(df1)),grp2=grepl("^B",colnames(df1)))
ks_AB
[1] 0.02857143 0.69937420 0.77142857 0.77142857 0.21055163
var_AB<-apply(df1,1,vartest,grp1=grepl("^A",colnames(df1)),grp2=grepl("^B",colnames(df1)))
var_AB
[1] 0.01700168 0.45132827 0.01224175 0.76109048 0.19561742
df1$ks_AB<-ks_AB
df1$var_AB<-var_AB
Затем я подставил данные в соответствии с тем, что я описал выше:
df_wilcox<-df1[df1$ks_AB<0.05,]
df_ttest_equal<-df1[df1$ks_AB>=0.05 & df1$var_AB>=0.05,]
df_ttest_unequal<-df1[df1$ks_AB>=0.05 & df1$var_AB<0.05,]
Наконец, я вычисляю соответствующий тест для новых фреймов данных и объединяю результаты
wilcox_AB<-as.matrix(apply(df_wilcox,1,wilcox,grp1=grepl("^A",colnames(df_wilcox)),grp2=grepl("^B",colnames(df_wilcox))))
ttest_equal_AB<-as.matrix(apply(df_ttest_equal,1,ttest_equal,grp1=grepl("^A",colnames(df_ttest_equal)),grp2=grepl("^B",colnames(df_ttest_equal))))
ttest_unequal_AB<-as.matrix(apply(df_ttest_unequal,1,ttest_unequal,grp1=grepl("^A",colnames(df_ttest_unequal)),grp2=grepl("^B",colnames(df_ttest_unequal))))
p_value<-rbind(wilcox_AB,ttest_equal_AB,ttest_unequal_AB)
colnames(p_value)<-c("pvalue")
df<-merge(df1,p_value,by="row.names")
df
Row.names A1 A2 A3 A4 B1 B2 B3 B4 ks_AB var_AB pvalue
1 N1 1 2 4 12 33 17 77 69 0.02857143 0.01700168 0.02857143
2 N2 34 20 59 21 90 20 43 44 0.69937420 0.45132827 0.39648631
3 N3 11 16 23 24 19 12 55 98 0.77142857 0.01224175 0.25822839
4 N4 29 111 335 34 61 88 110 320 0.77142857 0.76109048 0.85703939
5 N5 51 58 45 39 55 87 55 89 0.21055163 0.19561742 0.06610608
Я знаю, что мой код утомителен и глуп, но он очень хорошо работает с моими данными.Теперь я хочу знать, что я объединяю свой код выше с новой функцией, подобной дереву решений, функции if else, которая будет выглядеть так: ![enter image description here](https://i.stack.imgur.com/hE8wJ.png)