【问题标题】:Is there a way to run a wilcoxon test for variables with different lengths?有没有办法对不同长度的变量进行 wilcoxon 测试?
【发布时间】:2017-12-10 21:41:22
【问题描述】:

我正在尝试对数据框中的两个数据子集运行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 测试,所以应该有办法。欢迎任何建议。

【问题讨论】:

标签: r dataframe vector na


【解决方案1】:

是的,您可以针对不同长度的变量运行 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 值的向量,但您会丢失有关标签(物种)的信息。因此你应该写:

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)

【讨论】:

    【解决方案2】:

    怎么样

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

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

    【讨论】:

    • 非常感谢,R 的语法总是让我惊讶
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 2020-12-08
    • 2018-06-27
    • 2010-11-13
    • 2022-11-15
    • 2010-10-23
    • 2020-09-13
    • 1970-01-01
    相关资源
    最近更新 更多