查找 R 中特定行的回归和回归线的斜率
finding regression and slope of the regression line for specific rows in R
我正在处理一个具有纵向测量值的大型数据集。为了简化我在这里的工作是一个例子。可以说,一项研究测量了一段时间内特定城市的降雨量。下面是一个导入到 R 中的示例数据集。请注意,一些城市没有其他城市那么多的测量值,而且数据有点到处都是。这些城市的数据采集年份并不完全相同,所以我们可以把它们当作观测值来计算。
这是 R 中数据的样子
City Time.point Total.rain
City1 1 0.50
City1 2 0.70
City1 3 0.60
City1 4 0.40
City1 5 0.60
City1 6 0.20
City2 1 1.00
City2 2 0.80
City2 3 0.50
City2 4 0.80
City3 1 1.00
City3 2 1.20
City3 3 1.20
City4 1 0.30
City4 2 0.20
City4 3 0.30
City4 4 0.50
City4 5 0.10
City4 6 0.01
City4 7 0.02
City5 1 0.10
City5 2 0.15
City5 3 0.30
City5 4 0.30
City5 5 0.25
City5 6 0.30
我如何找到每个城市的回归,即最佳拟合线的斜率?
我不想比较城市。只需为每个城市找到这些数据,然后为每个城市创建一个包含单个点的新数据集。类似于下面的东西(如果我手工正确地做的话)。
City Regression.slope
City1 -0.05714286
City2 -0.09000000
City3 0.10000000
City4 -0.05071429
City5 0.03714286
非常感谢任何帮助。
我想这会让你到达那里。仔细检查 City5 上的计算。 :-)
library(dplyr)
library(purrr)
#nest each city into a data frame
df_City <- df %>%
group_by(City) %>%
nest()
#set up the regression model
model <- function(df) {
lm(Total.rain ~ Time.point, data = df)
}
#add model as another column in the data frame
data_City <- df_City %>%
mutate(model = purrr::map(data, model))
#extract the results using the broom package into separate columns
data_all <- data_City %>%
mutate(results = purrr::map(model, broom::tidy)) %>%
unnest(results, .drop = TRUE)
#filter/select for the sought after values
data_all %>%
filter(term == "Time.point") %>%
select(City, estimate)
City estimate
<chr> <dbl>
1 City1 -0.0571
2 City2 -0.0900
3 City3 0.100
4 City4 -0.0507
5 City5 0.0414
我认为这可以在一行代码中大大简化
整洁宇宙
dat %>% group_by(City) %>% summarize(est = lm(Total.rain~Time.point)$coef[2])
data.table
dat[, .(est = lm(Total.rain~Time.point)$coef[2]), by=.(City)]
输出:
City est
<char> <num>
1: City1 -0.05714286
2: City2 -0.09000000
3: City3 0.10000000
4: City4 -0.05071429
5: City5 0.03714286
我正在处理一个具有纵向测量值的大型数据集。为了简化我在这里的工作是一个例子。可以说,一项研究测量了一段时间内特定城市的降雨量。下面是一个导入到 R 中的示例数据集。请注意,一些城市没有其他城市那么多的测量值,而且数据有点到处都是。这些城市的数据采集年份并不完全相同,所以我们可以把它们当作观测值来计算。
这是 R 中数据的样子
City Time.point Total.rain
City1 1 0.50
City1 2 0.70
City1 3 0.60
City1 4 0.40
City1 5 0.60
City1 6 0.20
City2 1 1.00
City2 2 0.80
City2 3 0.50
City2 4 0.80
City3 1 1.00
City3 2 1.20
City3 3 1.20
City4 1 0.30
City4 2 0.20
City4 3 0.30
City4 4 0.50
City4 5 0.10
City4 6 0.01
City4 7 0.02
City5 1 0.10
City5 2 0.15
City5 3 0.30
City5 4 0.30
City5 5 0.25
City5 6 0.30
我如何找到每个城市的回归,即最佳拟合线的斜率? 我不想比较城市。只需为每个城市找到这些数据,然后为每个城市创建一个包含单个点的新数据集。类似于下面的东西(如果我手工正确地做的话)。
City Regression.slope
City1 -0.05714286
City2 -0.09000000
City3 0.10000000
City4 -0.05071429
City5 0.03714286
非常感谢任何帮助。
我想这会让你到达那里。仔细检查 City5 上的计算。 :-)
library(dplyr)
library(purrr)
#nest each city into a data frame
df_City <- df %>%
group_by(City) %>%
nest()
#set up the regression model
model <- function(df) {
lm(Total.rain ~ Time.point, data = df)
}
#add model as another column in the data frame
data_City <- df_City %>%
mutate(model = purrr::map(data, model))
#extract the results using the broom package into separate columns
data_all <- data_City %>%
mutate(results = purrr::map(model, broom::tidy)) %>%
unnest(results, .drop = TRUE)
#filter/select for the sought after values
data_all %>%
filter(term == "Time.point") %>%
select(City, estimate)
City estimate
<chr> <dbl>
1 City1 -0.0571
2 City2 -0.0900
3 City3 0.100
4 City4 -0.0507
5 City5 0.0414
我认为这可以在一行代码中大大简化
整洁宇宙
dat %>% group_by(City) %>% summarize(est = lm(Total.rain~Time.point)$coef[2])
data.table
dat[, .(est = lm(Total.rain~Time.point)$coef[2]), by=.(City)]
输出:
City est
<char> <num>
1: City1 -0.05714286
2: City2 -0.09000000
3: City3 0.10000000
4: City4 -0.05071429
5: City5 0.03714286