【问题标题】:How to specify two variable as equal levels of a factor?如何将两个变量指定为一个因子的相等水平?
【发布时间】:2019-10-10 15:09:09
【问题描述】:

在我的数据集中,我有一个名为 Condition 的变量。我将此建模为具有两个级别的因素:ControlTreatment。在同一个数据框中,我还有变量:Fish1Fish2Frechfires1Frenchfries2。我想将这些'Ordinalvariables' 建模为Fish 高于fries 的治疗组水平!同时,我想保持Fish1Fish2 的级别相等,fries1&2 相同,Treatment 的所有级别都相同(这是变量Condition 的级别)。

用于拟合混合模型:Health~Condition() 考虑到鱼和薯条的影响

Condition  SubNum  Trial Num_Fish1 Num_Fish2 Num_Fries1 Num_Fries2  Health
Treatment   1        1     1           1          2        1          3
Treatment   1        2     0           3          4        1          5
Control     2        1     0           0          0        0          4
Control     2        2     0           0          0        0          5

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • 平等到底是​​什么意思?它要么是序数的,要么是名义的。不是都。所以你宁愿让他们订购或不订购。
  • 所以在 Fish 和 Fries 之间,它是序数,但在 fish1 和 fish2 之间,它具有相同的权重年龄。它们仍然是两个治疗级别,但没有顺序或具有相同的重要性..但是 fis1 /fish2> Fies1/fries2 @Onyambu
  • @MrFlick 已编辑
  • 这仍然没有任何意义。你在这里适合什么类型的模型?你想用这些数据做什么?

标签: r dataframe regression factors multi-level


【解决方案1】:

如果我正确理解了这个问题,那么您真的只需要有序的因子级别“Fish”和“Fries”,数字 1 和 2 提供的每个级别之间有一些进一步的区别。

使用以下数据:

df <- read.table(text = "Condition  SubNum  Trial Num_Fish1 Num_Fish2 Num_Fries1 Num_Fries2  Health
Treatment   1        1     1           1          2        1          3
Treatment   1        2     0           3          4        1          5
Control     2        1     0           0          0        0          4
Control     2        2     0           0          0        0          5", header = T)

我会使用tidyr::gather() 将列名Num_* 放入变量product,然后将产品类型和产品编号分别提取到有序和无序因子。

library(tidyr)
library(dplyr)
library(stringr)

df_out <- df %>% 
    gather("product", "product_value", -c(Condition:Trial, Health)) %>% 
    mutate(product_num = factor(str_match(product, "\\d")),
           product = ordered(str_remove_all(product, "Num_|\\d"),
                             levels = c("Fries", "Fish")
                             )
    )

您应该最终得到一个如下所示的数据框,您可以使用它来灵活地比较“Fish”和“Fries”(序数),或“Fish 1”和“Fish 2”(在这两种情况下都只是“ Fish”,所以本质上是名义上的)等。我将product_num 转换为一个因子,而不是一个整数向量,以避免可能由整数的内在顺序引起的任何混淆。根据您的建模策略,您可能仍需要对数据进行子集化和/或重新分级。

# A tibble: 16 x 7
   Condition SubNum Trial Health product product_value product_num
   <fct>      <int> <int>  <int> <ord>           <int> <fct>      
 1 Treatment      1     1      3 Fish                1 1          
 2 Treatment      1     2      5 Fish                0 1          
 3 Control        2     1      4 Fish                0 1          
 4 Control        2     2      5 Fish                0 1          
 5 Treatment      1     1      3 Fish                1 2          
 6 Treatment      1     2      5 Fish                3 2          
 7 Control        2     1      4 Fish                0 2          
 8 Control        2     2      5 Fish                0 2          
 9 Treatment      1     1      3 Fries               2 1          
10 Treatment      1     2      5 Fries               4 1          
11 Control        2     1      4 Fries               0 1          
12 Control        2     2      5 Fries               0 1          
13 Treatment      1     1      3 Fries               1 2          
14 Treatment      1     2      5 Fries               1 2          
15 Control        2     1      4 Fries               0 2          
16 Control        2     2      5 Fries               0 2          

【讨论】:

  • 我会尝试挖掘这个,它看起来在逻辑上是可行的,谢谢!
  • @mashedpoteto 很乐意为您提供帮助。如果您喜欢这个答案,请考虑投票。如果答案解决了您的问题,请也接受它,以便其他人知道什么对您有用。
  • 当然,我会的。刚刚投了赞成票,但我需要更多点数才能计算我的赞成票。
  • 您认为这里的 Num_fish1/2 和 Num_freis1/2 是解释变量还是因变量? num_ 条鱼/薯条的上限为 20,这是在实验@gersht 下设计的
  • @mashedpoteto 我不知道实验的细节,但鱼/薯条似乎不太可能是响应变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 2021-04-15
相关资源
最近更新 更多