R 在缺少值的数据帧中以列方式循环lm()

R 在缺少值的数据帧中以列方式循环lm(),r,loops,apply,lm,R,Loops,Apply,Lm,我使用的是一个至少由三个变量(波长、辐照度、x)组成的数据框,我将其旋转,使每个波长都是一个新行,从而允许我在每个波长上运行lm(),并提取系数,以便我可以看到x如何随波长和辐照度变化 但是,我能够让它工作的唯一方法是在每个波长上显式运行lm()。这对于具有数百个参数的较大数据帧是不可行的,这些参数随波长和辐照度的变化而变化 我有一种感觉,这可以通过“应用”或编写循环来解决,但我没有任何运气让它们工作 有关该问题的示例,请参见下文 我还是个新手,所以任何指点都很感激 irr = rnorm(33

我使用的是一个至少由三个变量(波长、辐照度、x)组成的数据框,我将其旋转,使每个波长都是一个新行,从而允许我在每个波长上运行lm(),并提取系数,以便我可以看到x如何随波长和辐照度变化

但是,我能够让它工作的唯一方法是在每个波长上显式运行lm()。这对于具有数百个参数的较大数据帧是不可行的,这些参数随波长和辐照度的变化而变化

我有一种感觉,这可以通过“应用”或编写循环来解决,但我没有任何运气让它们工作

有关该问题的示例,请参见下文

我还是个新手,所以任何指点都很感激

irr = rnorm(33, 10, 3)
wave = c(290, 290, 290, 300, 300, 300, 310, 310, 310, 320, 320, 320, 330, 330, 330, 340, 340, 340, 350, 350, 350, 360, 360, 360, 370, 370, 370, 380, 380, 380, 400, 400, 400)
x = rnorm(33, 50, 2)
df <- as.data.frame(cbind(wave, irr, x))
df_wide <- df %>%
  pivot_wider(names_from = "wave",
              values_from = "x")
"290_lm" <- lm(df_wide$`290` ~ df_wide$irr) 
"300_lm" <- lm(df_wide$`300` ~ df_wide$irr) #etc through each wavelength

## Attempt at loop

for (i in 2:(ncol(df_wide))){
  irr <- df_wide[2][i]
  lm_function <- paste(irr,
                       sep = "~")
  df_lm = lm(lm_function, 
             data = df_wide[2:12])
}
irr=rnorm(33,10,3)
波=c(290290290290300300310310310310320320330330340340340340350350360360370370370370380380380380400400)
x=rnorm(33,50,2)

df当您保持长格式时,这可能要容易得多。只需使用
lappy
对数据进行子集设置即可。使用
setNames
生成的列表可以获得好的名称

res <- setNames(lapply(unique(df$wave), function(w) 
  lm(x ~ irr, data=df[df$wave %in% w, ])),
  paste0("wave.", unique(df$wave)))
res
# $wave.290
# 
# Call:
#   lm(formula = x ~ irr, data = df[df$wave %in% w, ])
# 
# Coefficients:
#   (Intercept)          irr  
# 36.837        1.503  
# 
# 
# $wave.300
# 
# Call:
#   lm(formula = x ~ irr, data = df[df$wave %in% w, ])
# 
# Coefficients:
#   (Intercept)          irr  
# 54.3785      -0.5586 
# [...]

res从您的描述中,我可以看出您的问题与
purr::map
的示例是相同的,这避免了需要进行扩展

库(dplyr)
图书馆(purrr)
结果列表%
分割(.$wave)%>%
map(~lm(x~irr,数据=.x))%>%
地图(摘要)
结果列表$`350`
#> 
#>电话:
#>lm(公式=x~irr,数据=0.x)
#> 
#>残差:
#>      19      20      21 
#>  0.2924 -2.2947  2.0023 
#> 
#>系数:
#>估计标准误差t值Pr(>t)
#>(截距)52.7276 6.2200 8.477 0.0748。
#>内部收益率-0.4977 0.6229-0.799 0.5708
#> ---
#>签名。代码:0'***'0.001'***'0.01'*'0.05'.'0.1''1
#> 
#>剩余标准误差:1个自由度上的3.059
#>多重R平方:0.3897,调整后的R平方:-0.2206
#>F统计量:1和1 DF上的0.6385,p值:0.5708
根据你的数据

irr=rnorm(33,10,3)
波=c(290290290290300300310310310310320320330330340340340340350350360360370370370370380380380380400400)
x=rnorm(33,50,2)
df附加溶液

library(tidyverse)
library(generics)
df %>% 
  group_by(wave) %>% 
  nest() %>% 
  mutate(model = map(data, ~ lm(x ~ irr, data = .x) %>% tidy)) %>% 
  select(-data) %>% 
  unnest(model)
或类似如下:

df <- data.frame(
  irr = rnorm(33, 10, 3),
  wave = c(290, 290, 290, 300, 300, 300, 310, 310, 310, 
           320, 320, 320, 330, 330, 330, 340, 340, 340, 350, 350, 350, 
           360, 360, 360, 370, 370, 370, 380, 380, 380, 400, 400, 400),
  x = rnorm(33, 50, 2)

)

mylm <- function(w) {
  m <- lm(x ~ irr, data = df, subset = (wave == w))
  ## outcomment the following if you just need the parameters
  # coef(m)
}

lapply(df$wave, mylm)

df我建议不要旋转,而是使用
lm
subset
选项。我还想知道线性模型中的因变量和自变量是什么。方法不错,但是我还需要加载包泛型。(使用R4.0.0测试,上周的包)。函数
tidy
或者更准确地说
tidy.lm
可以在包扫帚中找到:包泛型只是另一个包装器。因此,除了
库(泛型)
之外,还可以使用
库(扫帚)