正态分布(简写为R):按变量迭代



我有以下数据:

Height | Group
1,556  |  A
2,111  |  B
1,556  |  A
2,341  |  B
1,256  |  A
2,411  |  B

我想通过变量Group计算身高的shapiro wilk正态性检验

myvar <- c("Height")
res<- vector("list", length(myvars))
a <- factor(dataset1$Group)
myfactor <- levels(a)
i=1
for (myfactor in dataset1) {
    res[[i]] <- shapiro.test(dataset1$Size)
    i=i+1
}

res -返回n组测试,但都具有相同的p值和W。有人能帮我弄清楚是怎么回事吗?

编写新代码比找出代码中的所有错误更容易。

lapply(split(dataset1$Height,dataset1$Group),shapiro.test)
$`  A`
        Shapiro-Wilk normality test
data:  X[[1L]] 
W = 0.75, p-value = 3.031e-08

$`  B`
       Shapiro-Wilk normality test
data:  X[[2L]] 
W = 0.9134, p-value = 0.4295

您的代码被各种方式冲洗。以下是一些:

  1. 在循环之外创建myfactor,但随后将其作为迭代器。
  2. dataset1是您的数据(data.frame?)我甚至不确定myfactor将在for (myfactor in dataset1)创建的循环中。
  3. 您没有将发送到shapiro.test的数据子集。
  4. myvars没有定义,dataset1$Size应该是dataset1$Height

试试这个

res <- list()
for (mf in levels(dataset1$Group)) {
    res[[mf]] <- shapiro.test(dataset1$Height[dataset1$Group == mf])
}

感谢您的回复。
今后通知:
如果您希望计算(对于数据集中选定的变量)按因子的正态性检验:

variaveis <- colnames(dataset1)[c(1:2)]
/////alternative: variaveis <- c("height", "weight") 
res<- vector("list", length(variaveis))
for (i in 1:length(variaveis)) {
    #calcula o shapiro por factor para variaveis selecionadas
    res[[i]] <- lapply(split(dataset1[,variaveis[i]] ,dataset1$sex), shapiro.test)
}
res

PS: sex = GROUP在前面的例子中
再次谢谢
希望这段代码有助于减少代码m .