[英]How to calculate slope of regression line at different intervals on a curve and apply to multiple columns
[英]How to calculate slope and intercept for every row in different columns
我正在嘗試計算 dataframe 中不同列中每一行的斜率和截距。 output(截距和斜率)應作為新列添加到原始數據框中。
為了盡可能清楚我想要實現的目標,我在下面提供了一些數據:
locations<-c("a","b","c")
proportion.I<-c(0.073846154, 0.079710145, 0.063218391)
proportion.II<-c(0.049773659, 0.033756955, 0.011237956)
proportion.III<-c(0.090322581, 0.100917431, 0.08051443)
abundance.I<-c(331,331,331)
abundance.II<-c(178,178,178)
abundance.III<-c(87,87,87)
output.slope<-c(5.539e-05, -4.665e-05, -2.819e-05)
output.intercept<-c(5.128e-02, 8.073e-02, 5.726e-02)
df<-data.frame(locations, proportion.I, proportion.II, proportion.III, abundance.I, abundance.II, abundance.III, output.slope, output.intercept)
*我的線性回歸的“因”變量將是“比例”(第 2:4 行),預測變量(或自變量)將是“豐度”(第 5:7 行)。
好吧,您的數據不是“整潔”的格式,這使得大多數內置函數難以使用。 您可以使用dplyr
和tidyr
將您的數據轉換為共享,以便更輕松地進行分組回歸。 例如
library(dplyr)
library(tidyr)
df %>%
select(-starts_with("output")) %>% #drop "answers"
pivot_longer(proportion.I:abundance.III) %>% # convert to long format
separate(name, into = c("var", "idx")) %>% # get values from column names
pivot_wider(names_from=var, values_from=value) %>% # go back to wide
nest(data=-locations) %>%
mutate(reg = map(data, ~lm(abundance~proportion, .))) %>% # do the regression
mutate(intercept=map_dbl(reg, ~coefficients(.)[1]), # get values form regression
slope=map_dbl(reg, ~coefficients(.)[2]))
這與您提供的值相匹配,但從您的描述來看,您似乎希望以另一種方式回歸: ~lm(proportion~abundance, .)
我們可以在帶有base R
的for
循環中執行此操作。 創建一個length
等於數據集行數('out')的NULL
list
以存儲 output。 獲取數據集中“比例”、“豐度”列的名稱(“prp”、“abn”)。 循環遍歷數據集的行序列,提取“prp”、“abn”列,使用lm
創建 model,提取系數,並將其分配給“out”的list
元素。 最后, rbind
list
元素並將其分配給原始數據集中的新列
out <- vector('list', nrow(df))
prp <- names(df)[startsWith(names(df), "proportion")]
abn <- names(df)[startsWith(names(df), "abundance")]
for(i in seq_len(nrow(df))) out[[i]] <- coef(lm(abundance ~ proportion,
data.frame(abundance = unlist(df[i, abn]), proportion = unlist(df[i, prp]))))
df[c('slope', 'intercept')] <- do.call(rbind, out)[,2:1]
df[, c("slope", "intercept")]
# slope intercept
#1 -1613.9597 313.7648
#2 -601.7193 241.6664
#3 -329.6502 215.6954
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.