簡體   English   中英

如何計算不同列中每一行的斜率和截距

[英]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 行)。

好吧,您的數據不是“整潔”的格式,這使得大多數內置函數難以使用。 您可以使用dplyrtidyr將您的數據轉換為共享,以便更輕松地進行分組回歸。 例如

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 Rfor循環中執行此操作。 創建一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM