用于简单回归的 R 循环
Posted
技术标签:
【中文标题】用于简单回归的 R 循环【英文标题】:R loop for simple regression 【发布时间】:2018-07-07 15:39:49 【问题描述】:我想创建一个可以处理任何数据框的函数,具有最小列数 (1) 和最大列数 (n)。该函数必须对每个自变量进行简单的线性回归。我知道我必须使用 for (.) 循环,但我不知道如何使用它。 我试试这个,但它不起作用:
>data1<-read.csv(file.choose(),header=TRUE,sep=",")
>n<-nrow(data1)
>PredictorVariables <- paste("x", 1:n, sep="")
>Formula <-paste("y ~ ", PredictorVariables, collapse=" + ",data=data1)
>lm(Formula, data=data1)
【问题讨论】:
为什么要使用javascript
、android
、python
和 iphone
标签?
如果您想使用除y
之外的所有内容作为预测变量,您可以使用lm(y ~ ., data = data1)
。
我使用 javascript、android...因为我有标签来发布我的问题。
lm(y ~ ., data = data1) 并没有改变任何东西我仍然有同样的问题
评估错误(predvars, data, env) : objet 'y' introuvable
【参考方案1】:
以下内容如何:
首先,我创建一些示例数据:
# Sample data
set.seed(2017);
x <- sapply(1:10, function(x) x * seq(1:100) + rnorm(100));
df <- data.frame(Y = rowSums(x), x);
接下来我定义一个自定义函数:
# Custom function where
# df is the source dataframe
# idx.y is the column index of the response variable in df
# idx.x.min is the column index of the first explanatory variable
# idx.x.max is the column index of the last explanatory variable
# The function returns a list of lm objects
myfit <- function(df, idx.y, idx.x.min, idx.x.max)
stopifnot(idx.x.min < idx.x.max, idx.x.max <= ncol(df));
res <- list();
for (i in idx.x.min:idx.x.max)
res[[length(res) + 1]] <- lm(df[, idx.y] ~ df[, i]);
return(res);
然后我使用示例数据运行myfit
。
lst <- myfit(df, 1, 2, 11);
返回对象lst
是11-2+1 = 10
的list
适合类lm
的结果。例如,
lst[[1]];
#
#Call:
#lm(formula = df[, idx.y] ~ df[, i])
#
#Coefficients:
#(Intercept) df[, i]
# -5.121 55.100
PS
对于以后的帖子,我建议查看how to ask good questions here on SO,并提供minimal reproducible example/attempt,包括示例数据。
【讨论】:
【参考方案2】:这是一种使用lapply()
的方法,使用mtcars
数据集。我们将选择mpg
作为因变量,从数据集中提取剩余的列,然后使用lapply()
对indepVars
向量中的每个元素运行回归模型。每个模型的输出都保存到一个列表中,包括自变量的名称以及生成的模型对象。
indepVars <- names(mtcars)[!(names(mtcars) %in% "mpg")]
modelList <- lapply(indepVars,function(x)
result <- lm(mpg ~ mtcars[[x]],data=mtcars)
list(variable=x,model=result)
)
# print the first model
modelList[[1]]$variable
summary(modelList[[1]]$model)
然后可以使用提取运算符[[
打印任何模型的内容。
...和输出:
> # print the first model
> modelList[[1]]$variable
[1] "cyl"
> summary(modelList[[1]]$model)
Call:
lm(formula = mpg ~ mtcars[[x]], data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.9814 -2.1185 0.2217 1.0717 7.5186
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.8846 2.0738 18.27 < 2e-16 ***
mtcars[[x]] -2.8758 0.3224 -8.92 6.11e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.206 on 30 degrees of freedom
Multiple R-squared: 0.7262, Adjusted R-squared: 0.7171
F-statistic: 79.56 on 1 and 30 DF, p-value: 6.113e-10
>
回应原始发帖人的评论,这里是将上述过程封装在 R 函数中所需的代码。函数regList()
采用数据框名称和因变量字符串,然后继续对传递给函数的数据框中的每个剩余变量运行因变量的回归。
regList <- function(dataframe,depVar)
indepVars <- names(dataframe)[!(names(dataframe) %in% depVar)]
modelList <- lapply(indepVars,function(x)
message("x is: ",x)
result <- lm(dataframe[[depVar]] ~ dataframe[[x]],data=dataframe)
list(variable=x,model=result)
)
modelList
modelList <- regList(mtcars,"mpg")
# print the first model
modelList[[1]]$variable
summary(modelList[[1]]$model)
可以从单个模型对象中提取各种内容。输出如下:
> modelList <- regList(mtcars,"mpg")
> # print the first model
> modelList[[1]]$variable
[1] "cyl"
> summary(modelList[[1]]$model)
Call:
lm(formula = dataframe[[depVar]] ~ dataframe[[x]], data = dataframe)
Residuals:
Min 1Q Median 3Q Max
-4.9814 -2.1185 0.2217 1.0717 7.5186
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.8846 2.0738 18.27 < 2e-16 ***
dataframe[[x]] -2.8758 0.3224 -8.92 6.11e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.206 on 30 degrees of freedom
Multiple R-squared: 0.7262, Adjusted R-squared: 0.7171
F-statistic: 79.56 on 1 and 30 DF, p-value: 6.113e-10
>
【讨论】:
但我需要一个接收以下参数的函数:数据框、响应变量的列号、最小解释变量列的数量、最大解释变量列的数量。例如:function1 (df, 1, 2,10) 1是响应变量的列,解释变量位于2到10列 该函数对响应变量和数据框的解释变量集进行简单的线性回归(y ~ x1, y ~ x2, ... 等)它返回每个的诊断图表这些回归(2行,2列)。无论提交为所有数据帧的通用参数的数据帧如何,该函数都必须适用 @jean-philippe - 您的问题中应该包含上述 cmets 中的其他上下文以及 Minimal, Complete, and Verifiable Example。也就是说,我更新了我的答案以包含一个 R 函数,该函数允许指定数据框名称和因变量名称,而不是列号。答案可以很容易地调整为使用列号。 对不起,我只是 R 的初学者,对我来说太难了。非常感谢您的帮助。 我需要更通用的东西,使用列号来处理任何数据框中独立或依赖变量的任何名称。以上是关于用于简单回归的 R 循环的主要内容,如果未能解决你的问题,请参考以下文章