【问题标题】:R - How can I use the apply functions instead of iterating?R - 如何使用应用函数而不是迭代?
【发布时间】:2017-10-19 04:00:11
【问题描述】:

根据自变量 (ind_var) 对每个因变量 (dep_var) 进行回归

我正在尝试针对一个自变量执行多个因变量的线性回归一次一个。

当缺少观察值 (NA) 时,整行不会用于该特定回归。

我通过循环/迭代每一列因变量来完成它。

fit = list()
for( i in 1 : 2 ) {
    fit[[i]] = lm( mydf$Ind_Var[ which( !is.na( mydf[  , (2+i) ] ) ) ] ~ na.omit( mydf[ , (2+i) ] ) )
    }

不必涉及其他包(让我们限制为像 lmapply family functionsdo/do.call 这样的函数),如何我可以这样做吗?

随机数据

mydf = data.frame( 
"ID"    = rep( "A" , 25 ),
"Date"  = c( 1 : 25 ), 
"Dep_1" = c( 0.78670185, 0.15221561, NA, 0.85270392, 0.90057399, 0.75974473, 0.42026760, 0.64035871, 0.83012434, 0.04985492, 0.06619375, 0.36024745, 0.83969627, 0.45293842, 0.25272036, NA, 0.63783321, 0.42294695, 0.06726004, 0.14124547, 0.54590193, 0.99560087, 0.14255501, 0.41559977, 0.80120970) ,          
"Dep_2" = c( 0.736137983, 0.979317444, 0.901380500, 0.942325049, 0.420741297, NA, 0.243408607, 0.824064331, 0.462912557, NA, 0.710834065, 0.264922818, 0.797917063, 0.578866651, 0.955944058, 0.291149075, 0.437322581, 0.298153168, 0.579299049, 0.671718144, 0.545720702, 0.099175216, 0.808933227, 0.912825535, 0.417438973 ) ,          
"Ind_Var" = c( 75:51 )  )

我自己的转换尝试是:

apply( mydf[ ,-c(1:2) ] , 2 , function( x ) lm( mydf$Ind_Var[ which( !is.na( x ) ) ] ~ na.omit(x)  ) )

但这涉及到对 mydf 进行硬编码。

如果我使用了任何不正确的术语,我深表歉意。

【问题讨论】:

  • foreach 看起来不像基本函数。
  • 我只使用foreach 来创建列表,但为了保持一致性,我现在已将其编辑为for

标签: r linear-regression


【解决方案1】:

下面的方法呢

# Specify the columns that contain your predictor variables
predIdx <- c(3, 4);

# lm(y ~ x), for x being a single predictor
lapply(predIdx, function(x) lm(mydf[, ncol(mydf)] ~ mydf[, x]))

这里我假设响应总是在数据框的最后一列。您需要手动指定的是包含预测变量的列索引。

如果您想手动排除 NA,您可以在 lapply 函数中使用 complete.cases;这不应该是必要的,因为lm(默认情况下)处理 NA。


我不确定您所说的“硬编码 mydf”是什么意思。对于任何数据帧df,您可以将上面的代码包装在一个函数中以使其更通用,在predIdx 列中给出预测变量,在respIndx 列中给出自变量。

one_at_a_time_LM <- function(df, predIdx, respIdx) {
    lapply(predIdx, function(x) lm(df[, respIdx] ~ df[, x]))
}

one_at_a_time_LM(mydf, c(3, 4), 5);

【讨论】:

  • 在我使用的代码中,我有 lm( mydf$Ind_Var ....) 。我希望它更通用,就像x。我想一个更好的说法是手动指定,就像你做的那样。这很模糊,但希望这是有道理的。
  • 我明白了。在这种情况下,创建像one_at_a_time_LM 这样的通用函数将是可行的方法......
猜你喜欢
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多