【问题标题】:Regression in R using a function使用函数在 R 中回归
【发布时间】:2019-01-28 15:37:15
【问题描述】:

我正在尝试平滑数据框中每个变量的数据。假设它看起来像这样:

data <- data.frame(v1 = c(0.5,1.1,2.9,3.4,4.1,5.7,6.3,7.4,6.9,8.5,9.1),
                   v2 = c(0.1,0.8,0.5,1.1,1.9,2.4,0.8,3.4,2.9,3.1,4.2),
                   v3 = c(1.3,2.1,0.8,4.1,5.9,8.1,4.3,9.1,9.2,8.4,7.4))

data$x <- 1:nrow(data)

然后我将我的 x 和 y 变量指定为:

x <- data$x
y <- data$v1

我可以拟合我想要的预测线(我对这个过程很满意):

f <- function (x,a,b,d) {(a*x^2) + (b*x) + d}
order_two <- nls(y ~ f(x,a,b,d), start = c(a=1, b=1, d=1)) 
co2 <- coef(order_two)
data$order_two_predicted_v1 <- (co2[1] * (data$x)^2) + (co2[2] * data$x) + co2[3] 

因此,我最终得到了一个适当命名的新变量(v1 的预测值)。我现在想对我的数据框中的其他 100 个变量(本例中为 v2 和 v3)中的每一个执行此操作。

我尝试使用函数来执行此操作,但无法使其按预期工作。这是我的尝试:

myfunction <- function(xaxis,yaxis){
  # Specfiy my "y" and "x"
  x <- data$xaxis
  y <- data$yaxis

  f <- function (x,a,b,d) {(a*x^2) + (b*x) + d}
  order_two <- nls(y ~ f(x,a,b,d), start = c(a=1, b=1, d=1)) 
  co2 <- coef(order_two)
  data$order_two_predicted_yaxis <- (co2[1] * (data$x)^2) + (co2[2] * data$x) + co2[3]
}

myfunction(x,v1)
myfunction(x,v2)
myfunction(x,v3)

不仅函数不能按预期工作,我还想避免为每个变量调用函数 100 次,而是以某种方式循环遍历它。

这在 SAS 中使用宏非常简单,但我很难让它在 R 中工作。

【问题讨论】:

  • lm(v1 ~ I(x^2) + x + 1, data=data) - 参数 abd 是 x²、x 和1.
  • lapply(data[, 1:3], function(y) lm(y ~ data$x + I(data$x^2))) 为您提供所有模型的列表

标签: r function loops for-loop regression


【解决方案1】:

您可以直接使用lm() 函数对数据进行建模:

data <- data.frame(v1 = c(0.5,1.1,2.9,3.4,4.1,5.7,6.3,7.4,6.9,8.5,9.1),
                   v2 = c(0.1,0.8,0.5,1.1,1.9,2.4,0.8,3.4,2.9,3.1,4.2),
                   v3 = c(1.3,2.1,0.8,4.1,5.9,8.1,4.3,9.1,9.2,8.4,7.4))

x  <- 1:nrow(data)

# initialize a list to store the models 

models = vector("list", length = (ncol(data)))

# create a loop running over the columns of data

for (i in 1:(ncol(data))){
models[[i]] =  lm(data[,i] ~ poly(x,2, raw = TRUE))}

您也可以使用 lapply 代替 for 循环,如 cmets 中所述。

使用predict()获取模型的值:

smoothed_v1 = predict(model[[1]], newdata=data.frame(x = x))

编辑: 关于您的评论 - 您可以将新值存储在 data 中:

 for (i in (length(models):1)){
     data <- cbind(predict(models[[i]], newdata=data.frame(x = x)), data)

     # set the name for the new column

     names(data)[1]  = paste("pred_v",i, sep ="")}

【讨论】:

  • 谢谢大家!这很有帮助。
  • 有没有办法将预测值的列添加到原始数据集中?这样我就得到了包含 v1、v2、v3、x 和预测值 pred_v1、pred_v2、pred_v3 的数据框“数据”?
  • 预测 = 列表()
  • for (i in 1:3){ predict[[i]] = predict(models[[1]], newdata=data.frame(x = x)) }
  • 我编辑了问题,包括将模型值存储在原始 data.frame 中。
猜你喜欢
  • 2018-10-10
  • 2013-08-05
  • 1970-01-01
  • 2016-07-17
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多