这是关于r中的fourthcorner算法的一个问题,它被设计用来测量三个不同表之间的关系:n个位置(行)的m个环境变量(列)的nxm表(表r)、n个位置(行)的p丰度(列)的nxm表(表l)和p个物种的s性状(列)的pxs表(表q)。(行)。
fourthcorner函数位于包ade4中。
我的三个数据帧都是二进制的(0和1分别表示变量、一个地点的物种或一个特征的存在或不存在)我试过用“是”和“否”代替0和1,但没有成功。
下面是一些我使用的格式的矩阵示例:
塔布

Trait1  Trait2  Trait3  Trait4
Sp1 0   1   0   0
Sp2 0   1   0   0
Sp3 1   0   1   0
Sp4 1   0   1   0
Sp5 0   1   0   0
Sp6 0   1   0   0
Sp7 0   0   0   1
Sp8 0   0   0   1

泰伯
EnV1    EnV2    EnV3    EnV4
Site1   1   1   1   1
Site2   1   1   0   1
Site3   0   1   0   1
Site4   1   1   1   1
Site5   1   1   0   1
Site6   0   1   0   0
Site7   0   1   0   1
Site8   0   1   0   1
Site9   1   1   1   1
Site10  1   1   0   1
Site11  1   1   1   1
Site12  0   1   0   0
Site13  1   1   0   1
Site14  1   1   0   1
Site15  0   1   0   1
Site16  1   1   0   1
Site17  0   1   0   1
Site18  1   1   1   1
Site19  1   1   0   1
Site20  1   1   0   1


Sp1 Sp2 Sp3 Sp4 Sp5 Sp6 Sp7 Sp8
Site1   1   1   0   0   0   0   0   0
Site2   1   1   0   0   0   0   0   0
Site3   1   1   0   0   0   0   0   0
Site4   1   0   0   0   0   0   0   1
Site5   1   1   0   0   0   0   0   0
Site6   1   0   0   0   1   0   0   0
Site7   1   0   0   0   0   0   0   0
Site8   0   0   0   0   1   0   0   0
Site9   1   0   0   0   0   0   0   0
Site10  1   1   0   0   0   0   0   0
Site11  0   0   1   1   0   0   0   0
Site12  0   0   0   0   0   1   0   0
Site13  1   0   0   0   0   0   0   0
Site14  0   0   0   0   1   0   0   0
Site15  1   1   0   0   0   0   0   0
Site16  1   1   0   0   0   0   0   0
Site17  1   0   0   0   0   0   0   0
Site18  0   0   1   0   0   0   0   0
Site19  1   0   0   0   0   0   0   0
Site20  1   1   0   0   0   0   1   0

我从文本文件中将这些数据帧读入R,并指定第一列是行名。
这是我试图在矩阵上使用fourthcorner函数时得到的错误:
fourth1=fourthcorner(tabR,tabL,tabQ,nrepet=1)
应用时出错(sim,2,函数(x)长度(na.ommit(x)):
尺寸(x)必须为正长度
我不明白问题出在哪里,是格式问题吗如果是,我应该重新格式化其中一个矩阵吗哪一个引起了麻烦?或者我可以不使用二进制特性和环境变量来实现这个函数吗?换句话说,我可以通过改变一段代码来解决这个问题,还是不可能用这个函数来解决这个问题?
作为一个额外的花边新闻,我确实给这个函数的作者发了电子邮件,但是不幸的是我没有完全理解他的回答,可能是因为我的R技能还有很多需要改进的地方。如果有帮助,以下是他的回答:
q可以包含数量或质量特征。在r中,定性特征应编码为因子以获得适应性统计(即chi2或eta2)。如果将定性变量编码为伪变量,则它们将被视为定量变量。
非常感谢所有的洞察力。

最佳答案

我注意到你的例子失败了,只有nrepet等于1,所以如果你可以使用任何其他正数,你应该没问题。
但是,如果您确实需要nrepet=1,您应该与ade4的作者联系,并要求他/她修复fourthcorner函数代码。我追溯错误发现fourthcorner调用as.krandtestsim = res$tabD[-1,]其中res$tabD是一个包含nrepet+1行的矩阵。当nrepet=1并且从两行矩阵中删除一行时,R会自动将生成的一行矩阵转换为向量,但是as.krandtest函数希望sim是一个矩阵,因此会产生错误。
这是你的输入数据,以防有人想回答你的问题:
泰伯

structure(list(EnV1 = c(1L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L,
1L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L), EnV2 = c(1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), EnV3 = c(1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), EnV4 = c(1L, 1L, 1L, 1L, 1L,
0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("EnV1",
"EnV2", "EnV3", "EnV4"), row.names = c("Site1", "Site2", "Site3",
"Site4", "Site5", "Site6", "Site7", "Site8", "Site9", "Site10",
"Site11", "Site12", "Site13", "Site14", "Site15", "Site16", "Site17",
"Site18", "Site19", "Site20"), class = "data.frame")


structure(list(Sp1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L,
0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L), Sp2 = c(1L, 1L, 1L,
0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L,
1L), Sp3 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), Sp4 = c(0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
    Sp5 = c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L,
    1L, 0L, 0L, 0L, 0L, 0L, 0L), Sp6 = c(0L, 0L, 0L, 0L, 0L,
    0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
    ), Sp7 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), Sp8 = c(0L, 0L, 0L, 1L,
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
    0L)), .Names = c("Sp1", "Sp2", "Sp3", "Sp4", "Sp5", "Sp6",
"Sp7", "Sp8"), row.names = c("Site1", "Site2", "Site3", "Site4",
"Site5", "Site6", "Site7", "Site8", "Site9", "Site10", "Site11",
"Site12", "Site13", "Site14", "Site15", "Site16", "Site17", "Site18",
"Site19", "Site20"), class = "data.frame")

塔布
structure(list(Trait1 = c(0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L), Trait2 = c(1L,
1L, 0L, 0L, 1L, 1L, 0L, 0L), Trait3 = c(0L, 0L, 1L, 1L, 0L, 0L,
0L, 0L), Trait4 = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L)), .Names = c("Trait1",
"Trait2", "Trait3", "Trait4"), row.names = c("Sp1", "Sp2", "Sp3",
"Sp4", "Sp5", "Sp6", "Sp7", "Sp8"), class = "data.frame")

关于r - R中的第四个角算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27905963/

10-12 17:53