R中建模的数据整理

Posted

技术标签:

【中文标题】R中建模的数据整理【英文标题】:Data Wrangling for Modeling in R 【发布时间】:2022-01-18 07:36:57 【问题描述】:

我有一个类似附图形式的数据集(原版,# A tibble: 33,478 x 12),以及部分数据:

dput(head(canals2, n=10))

 structure(list(Site = c(1, 2, 4, 11, 10, 12, 13, 14, 15, 16), 
    `Sample Date` = c("2/11/2004", "2/11/2004", "2/11/2004", 
    "2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004", 
    "2/11/2004", "2/11/2004"), `Analysis code` = c("NH3", "NH3", 
    "NH3", "Chl a", "Chl a", "Chl a", "NH3", "Chl a", "NH3", 
    "NH3"), Analysis = c("Ammonia-Nitrogen", "Ammonia-Nitrogen", 
    "Ammonia-Nitrogen", "Chlorophyll a", "Chlorophyll a", "Chlorophyll a", 
    "Ammonia-Nitrogen", "Chlorophyll a", "Ammonia-Nitrogen", 
    "Ammonia-Nitrogen"), Result = c(0.068, 0.07, 0.014, 1.31, 
    1.39, 1.95, 0.247, 1.46, 0.113, 0.17), Units = c("mg/L", 
    "mg/L", "mg/L", "mg/m3", "mg/m3", "mg/m3", "mg/L", "mg/m3", 
    "mg/L", "mg/L")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

我想尝试使用线性模型(例如,使用 lm() 函数)从“氨氮”中预测“叶绿素 a”。 lm() 将列名作为“公式”的输入,但该数据集的生成方式却大不相同。我应该为每个分析使用Results 列中的值,但我似乎找不到这样组织数据的好方法。

到目前为止,我尝试通过分析拆分数据,目的是为每个分析创建一个新的数据框,然后将 Result 替换为在该数据框中选择的分析名称。这是我使用的函数(在主数据集上运行它,这就是它包含更多分析名称的原因):

analysis_list = unique(canals$Analysis)

> analysis_list

1 "氨氮" "叶绿素 a" "大肠菌群" [4] “比电导” “铜” “溶解氧” [7] “大肠杆菌”“肠球菌”“亚硝酸盐 + 硝酸盐” [10]“正磷酸盐”“pH”“盐度” [13]“温度”“总凯氏氮”“总氮” [16]“总磷”“浊度”

split_analyses <- function()
  canals_byAnalysis <- vector(mode = "list", length = 0)
  for (i in 1:17) 
    analysis <- analysis_list[i]
    updated_analysis <- canals %>% 
                    subset(Analysis == analysis, 
                    select = -c(`Analysis code`))
    canals_byAnalysis[[i]] <- updated_analysis
  

split_analyses()

不幸的是,这并没有按预期工作,我在合并我创建的表时遇到了很多问题。我也尝试了其他方法,但我一无所获。有人愿意提供任何建议吗?

【问题讨论】:

【参考方案1】:

如果我理解正确,那么听起来您正在尝试重组数据以将其转换为适合建模目的的形式。我认为使用pivot_wider(来自tidyr)会得到你想要的。这是我所做的:

首先,这是您作为数据框的数据:

Site <- c(1, 2, 4, 11, 10, 12, 13, 14, 15, 16)
Sample_Date <- c("2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004", 
"2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004", "2/11/2004")
Analysis_code <- c("NH3", "NH3", "NH3", "Chl a", "Chl a", "Chl a", "NH3", "Chl 
a", "NH3", "NH3")
Analysis <- c("Ammonia-Nitrogen", "Ammonia-Nitrogen", "Ammonia-Nitrogen", 
"Chlorophyll a", "Chlorophyll a", "Chlorophyll a", "Ammonia-Nitrogen", 
"Chlorophyll a", "Ammonia-Nitrogen", "Ammonia-Nitrogen")
Results <- c(0.068, 0.07, 0.014, 1.31, 1.39, 1.95, 0.247, 1.46, 0.113, 0.17)
Units <- c("mg/L", "mg/L", "mg/L", "mg/m3", "mg/m3", "mg/m3", "mg/L", "mg/m3", 
"mg/L", "mg/L")

   Site Sample_Date Analysis_code         Analysis Results Units
1     1   2/11/2004           NH3 Ammonia-Nitrogen   0.068  mg/L
2     2   2/11/2004           NH3 Ammonia-Nitrogen   0.070  mg/L
3     4   2/11/2004           NH3 Ammonia-Nitrogen   0.014  mg/L
4    11   2/11/2004         Chl a    Chlorophyll a   1.310 mg/m3
5    10   2/11/2004         Chl a    Chlorophyll a   1.390 mg/m3

接下来,我们将应用pivot_wider 来传播Analysis 变量。这将为您的每个 Analysis 类型留下一列,以及它们各自的 Results 值。

#spread the analysis variable
new_df <- df %>%
  pivot_wider(names_from = "Analysis", values_from = "Results")

    Site Sample_Date Analysis_code Units `Ammonia-Nitrogen` `Chlorophyll a`
   <dbl> <chr>       <chr>         <chr>              <dbl>           <dbl>
 1     1 2/11/2004   NH3           mg/L               0.068           NA   
 2     2 2/11/2004   NH3           mg/L               0.07            NA   
 3     4 2/11/2004   NH3           mg/L               0.014           NA   
 4    11 2/11/2004   Chl a         mg/m3             NA                1.31
 5    10 2/11/2004   Chl a         mg/m3             NA                1.39

【讨论】:

谢谢!该解决方案在这里工作得很好,但是当尝试在完整数据集上实现它时,传播变量(每个“分析”)变成了 而不是数字数据类型(,如上面的数据框)。这导致 lm() 函数出错。会不会是通过传播分析变量生成的 NA 的 b/c? 尝试使用as.numeric 转换回数字。我假设您正在尝试为每个 Analysis 类型构建单独的模型 - 例如,一个氨氮模型,一个用于叶绿素 a 等。如果是这种情况,您可以完全构建每个模型记录该模型的响应变量(例如,氨氮)不为 NULL。 lm 函数确实具有处理 NA 的一些内置功能,但是,我相信它主要适用于模型的解释变量。见na.actionrdocumentation.org/packages/stats/versions/3.6.2/topics/lm 当使用as.numeric 时,我收到错误'list' object cannot be coerced to type 'double',当我将na.action = na.omitlm() 函数一起使用时,我收到错误'invalid type (list) for variable &lt;varname&gt;' ...是的,我想为一些单独的分析建立模型,然后建立多个线性回归模型,以尝试从相关分析中预测叶绿素 a。 嗯,尝试使用unlist() 函数将列表转换为向量,然后尝试使用as.numeric。另一种方法是使用lapplyas.numeric 函数应用于列表的每个元素。

以上是关于R中建模的数据整理的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 Weibull 链接函数对数据进行建模

论文笔记 使用GCN建模关系数据

R语言时间序列ARMAX建模

1.27 Java学习系列(二十七)UML建模的理解和图形整理

从2021华中杯数学建模比赛中学到的东西整理

R语言-逻辑回归建模