首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >For-Loop的Purrr实现

For-Loop的Purrr实现
EN

Stack Overflow用户
提问于 2019-10-11 11:21:34
回答 2查看 77关注 0票数 0

我正在尝试在R中开发逻辑回归模型。我正在尝试循环遍历数据框(或tibble)的行,以便可以将该行中的列的子集乘以另一个向量作为点积。

我最初试图使用purrr的向量函数完成一些准备工作,但遇到了困难,决定在for循环中实现它。

这是我使用For-Loop的工作设计:

代码语言:javascript
复制
library(tidyverse)

# Define necessary functions
 lambdaFunc <- function(factors,theta){
 return((1+exp(sum(factors*theta)))^(-1))
}

# y is 0 or 1
# x and theta are a numeric vectors
indiv_likhd <- function(y,x,theta){
 return(lambdaFunc(x,theta)^y*(1-lambdaFunc(x,theta))^(1-y))
}

# Assuming df is dataframe of the form
# Col1                Col2      ...     ColN
# isDefault(0 or 1)   factor1   ...     factorN
likhds <- function(df,theta){
 df <- as.data.frame(df)
 likhds <- vector("numeric",nrow(df))
 for (i in 1:nrow(df)) {
   likhds[i] <- indiv_likhd(df[i,1],df[i,2:ncol(df)],theta)
 }
 return(likhds)
}

所以

代码语言:javascript
复制
testdf <- tibble(y=c(1,0),x_1=c(1,1),x_2=c(1,1),x_3=c(1,1))
testTheta <- c(1,1,1)
likhds(testdf,testTheta)

收益率

代码语言:javascript
复制
[1] 0.04742587 0.95257413

有没有办法用向量函数来实现这一点--特别是purr包?这是我关于stackoverflow的第一个真正的问题,所以如果有什么遗漏或不清楚的地方,我道歉,在这种情况下,请让我知道。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-11 11:34:38

在不更改lambdaFuncindiv_likhd的情况下,我们可以用pmap重写for循环

代码语言:javascript
复制
library(dplyr)
library(purrr)

testdf %>%
   mutate(new_col = pmap_dbl(., ~indiv_likhd(c(...)[1], c(...)[-1], testTheta)))

#      y   x_1   x_2   x_3 new_col
#  <dbl> <dbl> <dbl> <dbl>   <dbl>
#1     1     1     1     1  0.0474
#2     0     1     1     1  0.953 

c(...)用于捕获传递给pmap的所有值(这里是整行),因此c(...)[1]表示该行中的第一个值,c(...)[-1]表示该行中除第一个值之外的所有值。

票数 0
EN

Stack Overflow用户

发布于 2019-10-11 11:34:15

这里有一个选项

代码语言:javascript
复制
f <- function(df, theta) {
    df %>%
        group_by(y) %>%
        nest() %>%
        mutate(likhds = map2_dbl(y, data, function(y, x) indiv_likhd(y, x, theta))) %>%
        pull(likhds)
}
f(testdf, testTheta)
#[1] 0.04742587 0.95257413

说明:我们通过ynest数据,然后使用map2_dbl遍历每一行的ydata对(这是您的x值),并将indiv_likhd的输出作为double向量返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58333791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档