我有一个问题,用宽数据集运行glmnet套索.我的数据N = 50,但p> 49000,所有因素.所以要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(formula,data)时,我的内存耗尽,其中formula = Class~.
作为一个工作示例,我将生成一个数据集:
data <- matrix(rep(0,50*49000), nrow=50)
for(i in 1:50) {
x = rep(letters[2:8], 7000)
y = sample(x=1:49000, size=49000)
data[i,] <- x[y]
}
data <- as.data.frame(data)
x = c(rep('A', 20), rep('B', 15), rep('C', 15))
y = sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)
Run Code Online (Sandbox Code Playgroud)
之后,我尝试创建一个model.matrix进入glmnet.
formula <- as.formula(class ~ .)
X = model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)
Run Code Online (Sandbox Code Playgroud)
在最后一步(X = model.matrix ...),我的内存不足.我能做什么?
我正在使用 dummies 包为分类变量生成虚拟变量,其中一些具有两个以上的类别。
testdf<- data.frame(
"A" = as.factor(c(1,2,2,3,3,1)),
"B" = c('A','B','A','B','C','C'),
"C"= c('D','D','E','D','D','E'))
#
#Generate dummy variables:
#
testdf<- cbind(testdf, dummy(testdf$C, sep='_'))
testdf<- cbind(testdf, dummy(testdf$B, sep='_'))
Run Code Online (Sandbox Code Playgroud)
对于这两个命令,我得到:
Run Code Online (Sandbox Code Playgroud)Warning message: In model.matrix.default(~x - 1, model.frame(~x - 1), contrasts = FALSE) : non-list contrasts argument ignored
结果似乎是正确的。您能否就警告的原因提出建议?
在我的工作中,我更喜欢 Python 而不是 R。有时,我需要使用 R 函数,为此我开始尝试 Rpy2。
我尝试过但未能找到如何使用 Rpy2 复制以下内容
design <- model.matrix(~Subject+Treat)
Run Code Online (Sandbox Code Playgroud)
我已经走了这么远:
import rpy2.robjects as robjects
fmla = robjects.Formula('~subject+treatment')
env = fmla.environment
env['subject'] = sbj_group
env['treatment'] = trt_group
Run Code Online (Sandbox Code Playgroud)
从我在这里看到的。但我找不到如何表演model.matrix
。我尝试了几种不同的方法:
robjects.r.model_matrix(fmla)
robjects.r('model.matrix(%s)' %fmla.r_repr())
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,没有一个是正确的。
我是 Rpy2 的新手,并且在 R 方面经验不足。任何帮助将不胜感激!
我有一个data.table
DT
,我想继续model.matrix
它.每行都有一个字符串ID,存储在ID
列中DT
.当我跑步model.matrix
时DT
,我的公式排除了ID
列.问题是,model.matrix
由于NA而丢弃了一些行.如果我设置的rownames DT
到ID
列,调用之前model.matrix
,那么最终的模型矩阵具有rownames,和我都准备好.否则,我无法弄清楚我最终会遇到什么行.我正在设置rownames rownames(DT) = DT$ID
.但是,当我尝试添加新列时DT
,我会收到投诉
"检测到无效的.internal.selfref ......在早些时候,这个data.table已经被R复制了."
所以我很想知道
data.table
我有一个数据表,我想为每个唯一的日创建一个新列,然后在每一行中为每天匹配列名称分配1
我使用for循环完成了这个,但我想知道是否有任何方法使用data.table和set来优化它?
这是一个例子
dt <- data.table(Week_Day = c("Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"))
Day <- unique(dt$Week_Day)
for (i in 1:length(Day)) {
if (Day[i] != "Sunday") {
dt[, Day[i] := ifelse(Week_Day == Day[i], 1, 0)]
}
}
Run Code Online (Sandbox Code Playgroud)
我的表是298k行,虽然它不需要很长时间执行(下面),它是一个长脚本的一部分,我有相当多的低效循环,所以我试图让整个运行时间缩短.
运行时间:
user system elapsed
0.99 0.06 1.05
Run Code Online (Sandbox Code Playgroud)
提前致谢.
R 已经 3 天了,不知道我做错了什么。我正在尝试将一些具有两种方式交互的列发送到 glmnet cox 模型中。我有一些名为 dtable 的 data.frame()
编辑以使代码可重现
xs<-c("Col1", "Col2", "Col3")
v<-c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, NA, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, NA, 25, 26, 27, 28, 29, 30)
df<-data.frame(matrix(v,ncol=3))
dm<-as.matrix(df)
dm<-matrix(dm[complete.cases(dm)], ncol=3)
colnames(dm)<-xs
dfdata<-data.frame(dm)
f<-as.formula(time~.*.)
xmatrix<-model.matrix(f, dfdata)[,-1]
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我收到错误
Error in model.frame.default(object, data, xlev = xlev) :
object is not a matrix
Run Code Online (Sandbox Code Playgroud)
提前致谢
让我们用假数据创建一个矩阵:
data_ex <- data.frame(y = runif(5,0,1), a1 = runif(5,0,1), b2 = runif(5,0,1),
c3 = runif(5,0,1), d4 = runif(5,0,1))
> data_ex
y a1 b2 c3 d4
1 0.162 0.221 0.483 0.989 0.558
2 0.445 0.854 0.732 0.723 0.259
3 0.884 0.041 0.893 0.985 0.947
4 0.944 0.718 0.338 0.238 0.592
5 0.094 0.867 0.026 0.334 0.314
Run Code Online (Sandbox Code Playgroud)
该模型的公式如下:
forml <- as.formula("y ~ a1 + b2 + a1:c3:d4 + a1:c3 + a1:b2 + a1:b2:c3")
> forml
y ~ a1 + b2 + a1:c3:d4 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将带有分类变量的数据框转换为model.matrix但却失去了变量级别.
这是我的代码:
df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5), var1 = factor(rep(c('abc','def','ghi','jkl'),50)))
df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50))
df1$var3 <- factor(rep(c('abc','ghi','nop','xyz'),50))
df1$var2 <- as.character(df1$var2)
df1$var2 <- gsub('\\s','',df1$var2)
df1$var2 <- factor(df1$var2)
sapply(df1, levels)
mm1 <- model.matrix(~ 0+.,df1)
head(mm1)
Run Code Online (Sandbox Code Playgroud)
有什么建议?这是矩阵不可逆性问题吗?
我正在尝试使用model.matrix中data.frame的多个列.
数据框如下所示:
df1 <- data.frame(id=seq(1,10,1), zip1=(round(runif(10)*100000,0)), zip2=(round(runif(10)*100000,0))
,var1=round(runif(10)*100,1),Sales=round(runif(10)* 10000,2))
df1$zip1 <- ifelse(nchar(as.character(df1$zip1)) < 5,paste("0",as.character(df1$zip1),sep=""),df1$zip1)
df1$zip2 <- ifelse(nchar(as.character(df1$zip2)) < 5,paste("0",as.character(df1$zip2),sep=""),df1$zip2)
df1$zip1 <- factor(df1$zip1)
df1$zip2 <- factor(df1$zip2)
dput(df1)
> dput(df1)
structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), zip1 = structure(c(5L,
1L, 8L, 3L, 7L, 9L, 2L, 6L, 10L, 4L), .Label = c("16667", "21922",
"29100", "54398", "55447", "72607", "84667", "96562", "97012",
"99125"), class = "factor"), zip2 = structure(c(7L, 4L, 2L, 6L,
3L, 8L, 5L, 9L, 1L, 10L), .Label …
Run Code Online (Sandbox Code Playgroud) 我想创建一个指标变量矩阵。我最初的想法是使用 model.matrix,这里也建议使用:Automatically expand an R factor into a collection of 1/0 indicator variables for each factor level
但是,如果一个因子只有一个级别,则 model.matrix 似乎不起作用。
这是一个示例数据集,其中包含三个级别的因子“区域”:
dat = read.table(text = "
reg1 reg2 reg3
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
0 1 0
0 1 0
0 1 0
0 0 1
0 0 1
0 0 1
0 0 1
", sep = "", header = TRUE)
# model.matrix works if …
Run Code Online (Sandbox Code Playgroud) model.matrix ×10
r ×10
data.table ×2
glmnet ×2
matrix ×2
bigdata ×1
contrast ×1
formula ×1
indicator ×1
performance ×1
python ×1
rpy2 ×1