有没有办法对不同长度的变量进行wilcoxon测试?

时间:2017-12-10 21:41:23

标签: r dataframe vector na

我正在尝试在数据框的两个数据子集上运行wilcox.test()。它们的长度不相等(48对260)。我想知道活橡树和水栎树的dbh(胸径)是否有区别。

Pine_stand <- read.csv("Pine_stand.csv")
live_oaks <- subset(Pine_stand,Species=="live oak",select=c("dbh"));live_oaks
water_oaks <- subset(Pine_stand,Species=="water oak",select=c("dbh"));water_oaks

wilcox.test(live_oaks~water_oaks,conf.int=T,correct=F)
Error in model.frame.default(formula = live_oaks ~ water_oaks) : 
  invalid type (list) for variable 'live_oaks'

这是我的第一次尝试,然后我尝试了这个

Pine_stand <- read.csv("Pine_stand.csv")
live_dbh <- subset(Pine_stand,Species=="live oak",select=c("dbh"));live_oaks
water_dbh <- subset(Pine_stand,Species=="water oak",select=c("dbh"));water_oaks
oaks<-c(live_dbh,water_dbh)
wilcox.test(dbh~Species,data=oaks)
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 48, 260
>

并收到该错误。我已经尝试过对这两个组进行矢量化并追加tapply ...我知道有一个简单的答案我忽略了,我只是无法让它发挥作用。我正在阅读的所有例子都是比较两个长度相同的矢量。我知道当有不同的数字时我可以手工进行Wilcoxon测试,所以应该有办法。欢迎任何建议。

2 个答案:

答案 0 :(得分:3)

是的,您可以为不同长度的变量运行wilcox.test。如http://www.r-tutor.com/elementary-statistics/non-parametric-methods/mann-whitney-wilcoxon-test

中所述
  

“使用Mann-Whitney-Wilcoxon测试,我们可以决定是否   人口分布是相同的,不假设他们遵循   正常分布。“

因此,当不满足t检验的假设时(例如分布不正常或两个样本中的方差不相等),我们可以使用t检验的非参数等价物。

代码中的问题是这两个语句:

live_dbh <- subset(Pine_stand,Species=="live oak",select=c("dbh"))
water_dbh <- subset(Pine_stand,Species=="water oak",select=c("dbh"))

您正在创建两个仅包含dph值的向量,但您将丢失有关标签(Species)的信息。因此你应该写:

live_dbh <- subset(Pine_stand,Species=="live oak",select=c("dbh", “Species”))
water_dbh <- subset(Pine_stand,Species=="water oak",select=c("dbh", “Species”))

其次当你尝试两个用这个代码合并两个集合时:

oaks<-c(live_dbh,water_dbh)

而不是创建数据框,您创建一个列表。为什么会这样?首先,我们可以从c()的文档中读取,它的名称代表“将值组合到矢量或列表中”。可能你已经用它将两个向量合并为一个。然而,在子集函数的情况下,它实际上给出了一个列数据帧而不是向量。因此,我们的live_dbh和water_dbh集是数据框(现在标签上它们甚至有两列)。

如果是一列数据框,你总是可以使用c()函数,并将递归参数设置为TRUE来合并它们:

total<-c(one_column_df1, one_column_df2, recursive=TRUE)

然而,使用rbind函数通常更安全(并且它也是唯一可以在我们将数据帧与多个列合并的情况下起作用的函数)。 Rbind代表行绑定。

oaks<-rbind(live_dbh,water_dbh)

现在你应该可以运行wilcox.test:

wilcox.test(dbh~Species,data=oaks)

答案 1 :(得分:1)

怎么样

wilcox.test(dbh~Species, data=Pine_stand, 
            subset=(Species %in% c("live oak", "water oak"))

? (如果这些是您数据集中仅有的两个物种,则您不需要subset参数。)