我正在尝试编写一个函数,该函数创建一个数据帧中的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()...
您可以尝试使用定义的y和x变量在函数中创建公式: