使用 R 计算数据集中每个组的正态性
Calculate normality of each group in a dataset using R
我有一个包含大约 7 个条目的数据集。假设它有 5 列:
Cust_Id(around 340 unique Ids), Expense_Type, Expense($), Income_Type and Income($).
我想检查统计分析确定的任何 Cust_Id
组内收入和支出的相对稳定性。
我使用R的summaryBy
函数找出了数据的统计信息(均值、中值、标准差)。
现在我想找出每组 Cust_Id
的正态性。我使用了 shapiro.test()
函数,但它会导致整个数据而不是分组值的正态性得分。我是否走在解决需求的正确道路上?我是这个领域的新手。请提出解决这个问题的方法。
示例数据:
Cust_Id Income_Type Income Expense_Type Expense
10001 ABC 4356.89 XYZ 569.45
10003 DEF 5678.34 PQR 4532.43
10006 FRG 5783.43 JHK 9724.56
10001 DEG 5345.34 HTY 7856.34
10008 HGT 678.67 KIL 7893.13
10003 GRT 678.67 JHK 6544.11
不确定我是否理解问题。示例数据会有所帮助。如果您要测试每列的正态性,您可以 运行 对每个相关列进行测试。
例如,如果您的数据集名为 data
并且是 data.table,请参阅 class(data)
:
Expense <- data$Expense
shapiro.test(Expense)
您可以遍历各列(请参阅 apply
函数系列),或者如果您只有几列,则只需在相关的地方重复上述操作即可。
根据您想要弄清楚的内容,有多项测试:
https://en.wikipedia.org/wiki/Normality_test#Frequentist_tests
如果你说一百万 Cust_Id
其中有 340 个独特的,你可以为每个独特的组创建子 tables 并测试每个组的正常性。如果这是您想要的,我可以编写一个循环,然后为您提供 340 个唯一 ID 中每个特定列的正态性?
类似于:
library(data.table)
data <- data.table(data)
对于一个 id:
id_10 <- data[Cust_Id == 10]
id_10的考试费用:
shapiro.test(id_10$Expense)
循环播放:
for(i in unique(data$Cust_Id)){
u <- setDT(data)[Cust_Id == i]
s <- shapiro.test(u$Expense)
print(i)
print(s)
}
或者创建子集,然后对每个子集应用测试:
for(i in unique(data$Cust_Id)){
assign(paste0("id",i),setDT(data)[Cust_Id== i])
}
另一种方法是按唯一 ID 拆分:
z<-split(data,data$Cust_Id)
for(i in z){print(shapiro.test(i$Expense))}
编辑
要在 table 中得到结果:
使用样本table:
x <- data.frame(a=c(1,1,1,2,2,2,3,3,3,4,4,4),y=c(100,10,20,20,35,50,1,2,3,4,5,100),z=c(1,2,3,4,5,6,7,8,9,10,11,12))
df <- setDT(x)[, .(Normality_y = shapiro.test(y), Normality_z = shapiro.test(z), Count = .N), by = a]
df 将在末尾显示 y 和 z 列的正态性以及唯一 ID 的计数。请注意,对于每个 ID,normality_y 数据框中的第一个数字是 W 值,第二个数字是 p 值。
要清理它:
library(plyr)
df2 <- ddply(df, "a", function(z) head(z,2))
现在对于每个 ID,您将有两行用于 W 和 p 值。我使用了 y 和 z 列,您可以将它们更改为费用和收入等。添加更多列的语法应该很简单
尝试对数据进行子集化,您可以使用循环并将结果存储在列表中。
listids <- list()
for (ids in unique(df$Cust_Ids)){
subdf <- subset(x=df, subset=Cust_Ids==ids)
# apply the rest of your analysis there using subdf, for instance
listids[[ids]] <- shapiro.test(subdf$Expense)
}
我有一个包含大约 7 个条目的数据集。假设它有 5 列:
Cust_Id(around 340 unique Ids), Expense_Type, Expense($), Income_Type and Income($).
我想检查统计分析确定的任何 Cust_Id
组内收入和支出的相对稳定性。
我使用R的summaryBy
函数找出了数据的统计信息(均值、中值、标准差)。
现在我想找出每组 Cust_Id
的正态性。我使用了 shapiro.test()
函数,但它会导致整个数据而不是分组值的正态性得分。我是否走在解决需求的正确道路上?我是这个领域的新手。请提出解决这个问题的方法。
示例数据:
Cust_Id Income_Type Income Expense_Type Expense
10001 ABC 4356.89 XYZ 569.45
10003 DEF 5678.34 PQR 4532.43
10006 FRG 5783.43 JHK 9724.56
10001 DEG 5345.34 HTY 7856.34
10008 HGT 678.67 KIL 7893.13
10003 GRT 678.67 JHK 6544.11
不确定我是否理解问题。示例数据会有所帮助。如果您要测试每列的正态性,您可以 运行 对每个相关列进行测试。
例如,如果您的数据集名为 data
并且是 data.table,请参阅 class(data)
:
Expense <- data$Expense
shapiro.test(Expense)
您可以遍历各列(请参阅 apply
函数系列),或者如果您只有几列,则只需在相关的地方重复上述操作即可。
根据您想要弄清楚的内容,有多项测试: https://en.wikipedia.org/wiki/Normality_test#Frequentist_tests
如果你说一百万 Cust_Id
其中有 340 个独特的,你可以为每个独特的组创建子 tables 并测试每个组的正常性。如果这是您想要的,我可以编写一个循环,然后为您提供 340 个唯一 ID 中每个特定列的正态性?
类似于:
library(data.table)
data <- data.table(data)
对于一个 id:
id_10 <- data[Cust_Id == 10]
id_10的考试费用:
shapiro.test(id_10$Expense)
循环播放:
for(i in unique(data$Cust_Id)){
u <- setDT(data)[Cust_Id == i]
s <- shapiro.test(u$Expense)
print(i)
print(s)
}
或者创建子集,然后对每个子集应用测试:
for(i in unique(data$Cust_Id)){
assign(paste0("id",i),setDT(data)[Cust_Id== i])
}
另一种方法是按唯一 ID 拆分:
z<-split(data,data$Cust_Id)
for(i in z){print(shapiro.test(i$Expense))}
编辑
要在 table 中得到结果:
使用样本table:
x <- data.frame(a=c(1,1,1,2,2,2,3,3,3,4,4,4),y=c(100,10,20,20,35,50,1,2,3,4,5,100),z=c(1,2,3,4,5,6,7,8,9,10,11,12))
df <- setDT(x)[, .(Normality_y = shapiro.test(y), Normality_z = shapiro.test(z), Count = .N), by = a]
df 将在末尾显示 y 和 z 列的正态性以及唯一 ID 的计数。请注意,对于每个 ID,normality_y 数据框中的第一个数字是 W 值,第二个数字是 p 值。
要清理它:
library(plyr)
df2 <- ddply(df, "a", function(z) head(z,2))
现在对于每个 ID,您将有两行用于 W 和 p 值。我使用了 y 和 z 列,您可以将它们更改为费用和收入等。添加更多列的语法应该很简单
尝试对数据进行子集化,您可以使用循环并将结果存储在列表中。
listids <- list()
for (ids in unique(df$Cust_Ids)){
subdf <- subset(x=df, subset=Cust_Ids==ids)
# apply the rest of your analysis there using subdf, for instance
listids[[ids]] <- shapiro.test(subdf$Expense)
}