这些人口是非随机的和不同的吗?

机器算法验证 r 群体差异
2022-03-23 20:55:27

确定以下内容的最简单、最直接的方法是什么:

  1. A、B、C 是否非随机分布在每个组中(即:第 1 组中的 A 是否比随机机会预测的多?)
  2. A、B、C 的分布在各组之间是否不同。(即:第 1 组的 C 比 B 多,第 2 组也是如此 - 但两组之间的差异是否显着?)

数据:

Group,  A,   B,   C,
   1,   126, 357, 348   N=382
   2,   86,  196, 139   N=207
   3,   63,  185, 162   N=193
   4...
   5...

并以方便的 R-ready 格式:

A <- c(126,86,63,54,47,40,32,32,29,29,27,26,20,18,14)
B <- c(357,196,185,137,95,74,45,69,64,49,54,80,62,41,56)
C <- c(348,139,162,126,82,69,35,63,40,42,40,55,44,29,35)
N <- c(382,207,193,143,100,80,45,70,70,53,55,84,67,42,57)

A,B,C 是每个组中存在/不存在特征的计数,因此第 1 组中的很多 As 不是 。组是各自独立的非相关人群。

示例:假设每个组代表一种蜥蜴,而 A、B、C 表示蜥蜴的头部(A)、身体(B)或尾巴(C)是否有斑点。对于物种 1(第 1 组),检查了 382 只蜥蜴,126 头有斑点,357 头在身体上,348 头在尾巴上……在物种 2 的 207 只蜥蜴中,86 头有斑点,196 头有斑点,139 条尾巴有斑点.

那么,对于组中的成员来说,斑点是非随机的吗?不同组之间的斑点是否有显着差异?

我认为这是一个基本的基本问题,但是虽然我一直在抨击无数页的理论来解释针对更复杂情况的不同模型,但我完全忽略了基础知识——我只是最近才学到的。

感谢您帮助我重回正轨。

3个回答

对于问题 2,我将首先查看具有给定特征的每个组的百分比分布。例如:

A <- c(126,86,63,54,47,40,32,32,29,29,27,26,20,18,14)
B <- c(357,196,185,137,95,74,45,69,64,49,54,80,62,41,56)
C <- c(348,139,162,126,82,69,35,63,40,42,40,55,44,29,35)
N <- c(382,207,193,143,100,80,45,70,70,53,55,84,67,42,57)

A <- A/N
B <- B/N
C <- C/N

然后你可以制作一些茎叶图来检查分布:

> stem(A)

  The decimal point is 1 digit(s) to the left of the |

  2 | 5
  3 | 01338
  4 | 123679
  5 | 05
  6 | 
  7 | 1

> stem(B)

  The decimal point is 2 digit(s) to the left of the |

   90 | 4
   92 | 5555
   94 | 70289
   96 | 6
   98 | 226
  100 | 0

> stem(C)

  The decimal point is 1 digit(s) to the left of the |

  5 | 7
  6 | 15679
  7 | 389
  8 | 2468
  9 | 01

这三个看起来都有些正常,但这是非常主观的。只有 .71 instem(A)对我来说似乎是一个异常值。

我不确定我是否正确理解了这个问题 - 如果我错了,请纠正我,但这是我的想法:

那么,对于组中的成员来说,斑点是非随机的吗?不同组之间的斑点是否有显着差异?

我不确定第一个问题是否可以用所提供的数据来回答。如果数据以下列形式提供:

         Head Tail Body Group
Lizard 1   Y    N    N    A
Lizard 2   Y    Y    N    A
            ...

一个人将能够测试个人的随机性。然而,这些人——据我所知不可用——对吗?这同样适用于第二个问题,我将简单地用 Mann-Whitney-U 测试或类似的东西(在R使用中?wilcox.test)进行测试。

所以我希望我的问题是正确的 - 如果不是,请纠正我!


编辑

至于第二个问题:是否确定在一组中具有斑点的个体是否明显多于另一组。一种(也许是简单的)方法是采用上面给出的分布(正常密度为蓝色):

具有叠加正态分布的分布(蓝色)

并假设一个正态分布,然后根据平均值测试每个组。那将是:其中是组的平均值。z=(A1A¯)/σAA¯A

如果我犯了错误,请纠正我,但这会给出以下 p 值:

pnorm((A-mean(A))/sd(A))
  [1] 0.21718755 0.47952112 0.20871568 0.35415346 0.66053450 0.74852194
  [7] 0.99325922 0.61952780 0.47553465 0.85819411 0.72317286 0.16977245
 [13] 0.14707919 0.52412299 0.06677287

我不确定我是否完全了解情况(您的数据或您的问题)。@Zach 有一些好主意,所以我想我会跟随他的领导并抛出一些信息,我们会看看是否有帮助。

1)要确定数据是否随机,可以使用运行测试。运行是一系列在某些方面相似的数据点。(至少)有两种方法可以进行运行测试。 首先,您可以检查每个新数据点是高于还是低于前一个数据点,或者,您可以检查每个数据点相对于中位数是高还是低。这两个都假设您的数据按生成它们的时间顺序排序。从那里,您使用上述方法之一将数据转换为一串一和零。相同类型的连续值是一次运行(例如,1101 是 3 次运行)。运行次数是二项式随机变量。这是R的一些代码:

# compute proportions & create vectors for runs
Aprop   = A/N;     Bprop   = B/N;     Cprop   = C/N
Achange = c();     Bchange = c();     Cchange = c()
Ahigh   = c();     Bhigh   = c();     Chigh   = c()

for(i in 1:length(N)) {
  if(i>1) {
    # determine if values went up or down
    Achange[i-1] = (Aprop[i]-Aprop[i-1])>0
    Bchange[i-1] = (Bprop[i]-Bprop[i-1])>0
    Cchange[i-1] = (Cprop[i]-Cprop[i-1])>0
  }
  # determine if values are high or low
  Ahigh[i] = Aprop[i]>median(Aprop)
  Bhigh[i] = Bprop[i]>median(Bprop)
  Chigh[i] = Cprop[i]>median(Cprop)
}

# conduct analyses
round(Aprop, 2)     
# [1] 0.33 0.42 0.33 0.38 0.47 0.50 0.71 0.46 0.41 0.55 0.49 0.31 0.30 0.43 0.25

as.numeric(Achange)            # [1] 1 0 1 1 1 1 0 0 1 0 0 0 1 0     (8 runs)
runs.test(as.factor(Achange))

    Runs Test

data:  as.factor(Achange) 
Standard Normal = 0, p-value = 1
alternative hypothesis: two.sided

as.numeric(Ahigh)             # [1] 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0     (7 runs)
runs.test(as.factor(Ahigh))

    Runs Test

data:  as.factor(Ahigh) 
Standard Normal = -0.7898, p-value = 0.4297
alternative hypothesis: two.sided

因此,根据这两种方法,A 组看起来是随机的。(请记住,该测试依赖于大样本理论,并且您的 N 为 15,但数据似乎还可以。另外请记住,如果您有一堆组并且您对它们进行了一堆测试,那么可能会发生一些事情显示它是否真实。)

2) 要确定分布是否相似,您可以计算汇总统计量并绘制图表。我经常发现图表最有帮助。我喜欢的两个图是核密度图和 qq 图。核密度图就像一个平滑的直方图将多个分布绘制在一起很容易。一个QQ图是一个分布对另一个分布的散点图,在两者都按升序排序后。如果两个分布具有相似的形状,则这些点应位于通过原点的 45 度线。大多数人认为 qq-plots 是一种将分布与理论正态分布进行比较的方法,但它们可以用于任何理论分布(例如 Weibull)或另一个数据集的经验分布。因此,您可以制作一系列图以进行成对比较。它还有助于绘制 45 度线以帮助解释。这是一些R代码和图表:

summary(Aprop)
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 0.2456  0.3281  0.4155  0.4215  0.4805  0.7111 

windows()
plot( density(Aprop), col="gold", xlim=c(0,1))
lines(density(Bprop), col="red")
lines(density(Cprop), col="blue")
legend("topleft", c("Aprop","Bprop","Cprop"), lty=1,
       col=c("gold","red","blue"))

windows()
qqplot(Aprop, Cprop)
abline(0, 1)

windows()
qqplot(Aprop, Bprop)
abline(0, 1)

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

第一个 qq 图显示 A 组和 C 组的分布非常相似——它们很好地遵循 45 度线。只是 C 始终高于 A。这可以通过查看密度图来确认。起初,下方的 qq-plot 看起来不错,但您注意到 45 度线甚至没有出现在绘图窗口中。这是一个很大的提示。如果您查看刻度,您会发现 B 在 0.91 到 1.0 之间变化,而 A 在 0.3 到 0.7 之间变化。正如您在密度图中看到的那样,A 和 B 并不那么相似。密度图确实提供了丰富的信息,但它们也可以夸大分布的形状。这就是为什么绘制两者都很好的原因。A 和 C 在密度图中看起来相当不同,但基于 qq-plot,我' d 打赌分布形状的差异是不可靠的。这两个图都表明@Zach 对那个异常值是正确的。