R - 如何使用apply函数而不是迭代?

R - 如何使用apply函数而不是迭代?

问题描述:

回归每个因变量(dep_var)对独立变量(ind_var)

我试图对一个独立变量一次一个执行针对多个因变量线性回归。R - 如何使用apply函数而不是迭代?

当存在缺失观察(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) ])) 
    } 

而不必涉及其他包(让我们限制功能,如流明申请家庭功能做/ 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硬编码。

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

+0

'foreach'看起来不像基本功能。 –

+0

我只使用'foreach'来创建列表,但为了保持一致性,我已经将它编辑为'for'。 – mathnoob

什么下列方法

# 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); 
+0

在我使用的代码中,我有'lm(mydf $ Ind_Var ....)'。我希望它像'x'一样更普遍。 我想有一种更好的方式来说,它可能会像以前那样手动指定。 它非常含糊,但希望这是有道理的。 – mathnoob

+0

我明白了。在这种情况下,创建一个像'one_at_a_time_LM'这样的通用函数将成为... –