如何更改lm对象列表中的通用lm()系数名称以供预测()使用?

问题描述 投票:0回答:1

我正在尝试编写一个函数,该函数创建一个数据帧中的lm对象的列表,而我的数据集中的每个唯一日期都有一个不同的lm。然后,我希望能够将这些lms传递给带有新数据框的predict(),以生成预测值和置信区间。

数据看起来像这样:

Date        ppm area
10/18/2019  0   0
10/18/2019  0   0
10/18/2019  0.1 438.9804
10/18/2019  0.1 447.1784
10/18/2019  0.1 443.7794
10/18/2019  1   3232.2088
10/18/2019  1   3206.6672
10/18/2019  1   3206.232
10/24/2019  0   0
10/24/2019  0   15.98
10/24/2019  0   0
10/24/2019  0   0
10/24/2019  0.1 379.387
10/24/2019  0.1 325.5268
10/24/2019  0.1 325.8126
10/24/2019  0.1 310.5972
10/24/2019  1   3259.366
10/24/2019  1   3218.0836
10/24/2019  1   3192.7076

[第一部分似乎很简单-编写一个为每个日期创建不同lm的函数:

standard.lm= function(standards,
                          date_field = "date",
                          peak_field,
                          std_field,
                          peak_field2 = NA){
  library(tidyverse)
  library(broom)


  y = standards %>% nest(-date_field) %>%
    mutate(fit = map(data, ~lm(.[[std_field]] ~ .[[peak_field]], data = .)))

    return(y)  }

然后我可以运行命令:

test = standard.lm(standard_data, std_field = "std.ppm", peak_field = "area")

这很好地为每个日期生成lms,但是问题是系数被命名为.[[peak_field]]而不是"area"

这给我造成了一个问题,因为我想将这些lm对象传递给predict(),以根据面积测量值预测ppm值。我在下一个数据表中的列将命名为area,而我无法将其重命名为.[[peak_field]]。我尝试这样的操作,但出现错误:

a = c(1300.1, 1400.3, 1500.9)
df = data.frame(area = a)
df$std.ppm = predict(test$fit[[1]], newdata = df)

$<-.data.frame*tmp*中的错误,标准ppm,值= c(1 = -0.00299110569401364,:替换有8行,数据有3行另外:警告消息:'newdata'有3行,但是找到的变量有8行

发生这种情况是因为predict()正在寻找名为.[[peak_field]]的列而不是识别区域,并且正在预测原始输入lm数据的值,而不是我想要它预测的数据。

因此,基本上,我正在寻找解决此问题的解决方案。最好的解决方案是让我在最初在第一个函数中创建lm对象时指定系数名称,但是我可以接受允许我指定在predict()中使用哪一列的东西

我正在尝试编写一个函数,该函数创建一个数据帧中的lm对象的列表,而我的数据集中的每个唯一日期都有一个不同的lm。然后,我希望能够将这些lm传递给predict()...

r tidyverse lm predict
1个回答
0
投票

您可以尝试使用定义的y和x变量在函数中创建公式:

© www.soinside.com 2019 - 2024. All rights reserved.