我正在尝试在R中开发一个逻辑回归模型。我正在试图遍历数据框(或小标题)的行,以便可以将该行中的列子集乘以另一个矢量作为点积
最初,我尝试使用purrr的向量函数来完成一些准备工作,但是遇到了困难,因此决定在for循环中实现它。
这是我使用前循环的工作设计:
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)
}
所以
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)
收益
[1] 0.04742587 0.95257413
有没有一种方法可以使用矢量函数来实现,特别是purr包?这是我关于stackoverflow的第一个真实问题,因此,如果有遗漏或不清楚的地方,我深表歉意。在这种情况下,请告诉我。
谢谢。
答案 0 :(得分:0)
这是一个选择
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
说明:我们用nest
来y
个数据,然后使用map2_dbl
遍历y
和data
对(即您的{{1 }}值),并以x
向量的形式返回indiv_likhd
的输出。
答案 1 :(得分:0)
无需更改您的git >=2.23
和lambdaFunc
,我们可以使用indiv_likhd
重写您的for
循环
pmap
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]
表示所有内容除了该行中的第一个值。