Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何在数据帧列表上循环线性模型?_R_Loops_Linear Regression - Fatal编程技术网

R:如何在数据帧列表上循环线性模型?

R:如何在数据帧列表上循环线性模型?,r,loops,linear-regression,R,Loops,Linear Regression,我有一个名为AllFramesCoeff的数据帧列表。我想生成一个随机数,让我的数据帧列表引用该数字以引用一个随机数据帧,并在列表中185个数据帧中的一个上使用for循环,用于lm模型的两个特定列。我想让它做1000个随机测试 我还想把lm系数结果放在一个对象中,可能是一个向量 我的计划是稍后返回并创建柱状图、分布,也许插入新的列来重复它 我所尝试的: m <- matrix(0, ncol = 2) CorrResults<- as.data.frame(m) for (i in

我有一个名为
AllFramesCoeff
的数据帧列表。我想生成一个随机数,让我的数据帧列表引用该数字以引用一个随机数据帧,并在列表中185个数据帧中的一个上使用for循环,用于
lm
模型的两个特定列。我想让它做1000个随机测试

我还想把lm系数结果放在一个对象中,可能是一个向量

我的计划是稍后返回并创建柱状图、分布,也许插入新的列来重复它

我所尝试的:

m <- matrix(0, ncol = 2)
CorrResults<- as.data.frame(m)
for (i in length(WaFramesCoeff)) function() {
  r <- sample(185, 1)
  CorrLM <-lm(  WaFramesCoeff[i]$ `Nights_&_Weekends_Min_Used`    ~  WaFramesCoeff[i]$ `Taxes,_Surcharges_and_Fees`    ,data=WaFramesCoeff[i]  )
  CorrResults[i,]<- CorrLM$Coeff
}

m让我们通过一种不同的方式来想象做这种事情

首先,要知道
for
循环有其位置,如果操作得当,它们的速度可以与
*apply
函数的速度一样快。虽然循环的使用在语法上是正确的,但是有不同的方法可以使用它,这可能更有意义。您正在尝试对列表的多个元素运行一系列命令或函数。想象一下这个简单的计划:对于列表中的每个元素,取第一个元素,然后将其加倍并平方:

invec <- list(c(21,22),c(23,24),c(25,26))
str(invec)
# List of 3
#  $ : num [1:2] 21 22
#  $ : num [1:2] 23 24
#  $ : num [1:2] 25 26
outvec <- replicate(length(invec), NULL) # preallocate same size
for (i in seq_along(invec)) {
  outvec[[i]] <- c(2*invec[[i]][1], invec[[i]][1]^2)
}
str(outvec)
# List of 3
#  $ : num [1:2] 42 441
#  $ : num [1:2] 46 529
#  $ : num [1:2] 50 625
读取apply函数的方法是“获取向量
invec
,并对每个元素调用此函数,将结果捕获到一个列表names
outvec
”。该函数可以是“匿名”(就像这里一样),也可以是“命名”函数,例如

lapply(invec, max)
# [[1]]
# [1] 22
#
# [[2]]
# [1] 24
#
# [[3]]
# [1] 26
那么这对你的取样问题有什么帮助呢?让我再分散一下

你知道你可以任意索引向量和列表吗?例如:

str(invec[c(1,3,2,3,2,3)])
# List of 6
#  $ : num [1:2] 21 22
#  $ : num [1:2] 25 26
#  $ : num [1:2] 23 24
#  $ : num [1:2] 25 26
#  $ : num [1:2] 23 24
#  $ : num [1:2] 25 26
这是骗局,好吧。假设我们想从这个非常短的列表中随机抽取1000个样本:

set.seed(3)
ind <- sample(length(invec), size=1000, replace=TRUE)
str(outvec[1:4])
# List of 4
#  $ : num 42
#  $ : num 46
#  $ : num 50
#  $ : num 46
outvec <- lapply(invec[ind], function(a) 2*a[1])
str(outvec[1:4])
# List of 4
#  $ : num 42
#  $ : num 50
#  $ : num 46
#  $ : num 42
现在我有一个185个data.frames的列表,每个都有相同的两个变量
x
y
。让我们把你的问题应用到这些数据上。哦,而且随机性可能很耗时。(顺便说一句:一次获得1000个随机数要比1000次获得1个随机数快得多。)

(只要对所有元素应用相同的回归,
lm
部分可以是您需要的任何部分。函数中的代码可以是您需要的任何长度,因此可以这样考虑:

lms <- lapply(lst[ind], function(a) {
  z <- lm(y~x, data=a)
  return(z)
})
“但我不需要整个模型,我只需要系数!”当然,你是对的。当你知道你只需要一件东西时,你显然可以切入正题直接得到它(例如
coef(lm(y~x,data=a))
).因此,我不需要重新运行随机样本的1000个回归,我只需要做另一个
lappy

coefs <- lapply(lms[1:3], coef)
str(coefs[1:3])
# List of 3
#  $ : Named num [1:2] 80.452 -0.422
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
#  $ : Named num [1:2] 60.77 -0.19
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
#  $ : Named num [1:2] 53.716 -0.189
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
或者我可以在前面使用“简单应用”(可选,但默认为“是”)将结果简化为矩阵或向量。如果任何返回值的大小与其他值不同,它将始终返回一个列表。(正因为如此,不简化它,做一些健全性检查,然后再重新绑定它们,在编程上可能更容易防御。)


coefs2你好,Kootseahknee。你的问题/代码让人困惑。你给
r
分配了一个随机数,却从不使用它。你想用它做什么?基于这一点和你最近的其他问题,你真的应该使用
lappy
来管理/处理你的数据列表。框架,顺便说一句。你好,又一次!是的,这是很多人想要的人们一直在告诉我。我不知道为什么我会被困在循环中。我知道我没有正确地使用它。我试图让它随机化一个数字,并让一个lm模型在调用列表中的数据帧时应用它,使用那个随机化的数字来选择一个。我想让它这样做1000次,并将lm系数存储在一个向量中。我非常高兴rry,我知道我的代码很混乱。当我到达这个网站时,这是因为我已经用尽了所有选项并对其进行了多次编辑。所以…你知道你的结果矩阵将有185行,但你无法知道哪个模型驱动哪一行,对吗?这是你想要的吗?或者你想回归所有这些,但你不想想要/需要知道顺序吗?还有别的吗?我希望对185个数据帧中的一个运行1000次,每次都随机运行,然后将每个结果系数存储在一个向量中供以后使用。一些想法:从调用
lm
中删除
x$
,这在
data=x
中有所涉及;你抱怨“只有一点”,那么为什么要预先定义一个只有一列的矩阵呢?你应该得到截距和斜率,所以也许
矩阵(nr=1000,nc=2)
,然后
corresults[i,]怎么样,Kootseahknee?这有没有偏离主题,或者它提供了什么帮助?您好。我很抱歉回复太晚,我正忙于完成这个问题的项目。这非常有帮助!它确实回答了我的问题,但也澄清了我遇到的其他问题的一些问题。我无法感谢您eno啊,感谢你花时间为我写下这一切。
set.seed(3)
ind <- sample(length(invec), size=1000, replace=TRUE)
str(outvec[1:4])
# List of 4
#  $ : num 42
#  $ : num 46
#  $ : num 50
#  $ : num 46
outvec <- lapply(invec[ind], function(a) 2*a[1])
str(outvec[1:4])
# List of 4
#  $ : num 42
#  $ : num 50
#  $ : num 46
#  $ : num 42
set.seed(2)
n <- 20
lst <- lapply(1:185, function(ign) data.frame(x=sample(100,size=n), y=sample(100,size=n)))

str(lst[1:2])
# List of 2
#  $ :'data.frame': 20 obs. of  2 variables:
#   ..$ x: int [1:20] 19 70 57 17 91 90 13 78 44 51 ...
#   ..$ y: int [1:20] 67 39 83 15 34 47 97 96 89 13 ...
#  $ :'data.frame': 20 obs. of  2 variables:
#   ..$ x: int [1:20] 99 30 12 16 91 76 92 33 47 74 ...
#   ..$ y: int [1:20] 78 88 62 26 83 42 37 43 21 7 ...
ind <- sample(185, size=1000, replace=TRUE)
lms <- lapply(lst[ind], function(a) lm(y~x, data=a))
lms <- lapply(lst[ind], function(a) {
  z <- lm(y~x, data=a)
  return(z)
})
summary(lms[[1]])
# Call:
# lm(formula = y ~ x, data = a)
# Residuals:
#     Min      1Q  Median      3Q     Max 
# -53.944 -13.463  -1.239  15.473  44.430 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  80.4523    15.3577   5.239 5.56e-05 ***
# x            -0.4217     0.2499  -1.687    0.109    
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Residual standard error: 25.23 on 18 degrees of freedom
# Multiple R-squared:  0.1366,  Adjusted R-squared:  0.0886 
# F-statistic: 2.847 on 1 and 18 DF,  p-value: 0.1088
summary(lms[[2]])
# Call:
# lm(formula = y ~ x, data = a)
# Residuals:
#     Min      1Q  Median      3Q     Max 
# -55.108 -20.653  -0.465  18.827  42.747 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)    
# (Intercept)  60.7651    12.2366   4.966    1e-04 ***
# x            -0.1898     0.2060  -0.922    0.369    
# ---
# Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Residual standard error: 27.37 on 18 degrees of freedom
# Multiple R-squared:  0.04506, Adjusted R-squared:  -0.007996 
# F-statistic: 0.8493 on 1 and 18 DF,  p-value: 0.3689
coefs <- lapply(lms[1:3], coef)
str(coefs[1:3])
# List of 3
#  $ : Named num [1:2] 80.452 -0.422
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
#  $ : Named num [1:2] 60.77 -0.19
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
#  $ : Named num [1:2] 53.716 -0.189
#   ..- attr(*, "names")= chr [1:2] "(Intercept)" "x"
head(do.call(rbind, coefs))
#      (Intercept)           x
# [1,]    80.45230 -0.42173749
# [2,]    60.76507 -0.18979726
# [3,]    53.71643 -0.18883933
# [4,]    49.51803  0.01494021
# [5,]    49.51803  0.01494021
# [6,]    68.25463 -0.25840920
coefs2 <- t(sapply(lms, coef))
head(coefs2)
#      (Intercept)           x
# [1,]    80.45230 -0.42173749
# [2,]    60.76507 -0.18979726
# [3,]    53.71643 -0.18883933
# [4,]    49.51803  0.01494021
# [5,]    49.51803  0.01494021
# [6,]    68.25463 -0.25840920