我想知道是否有辦法為 lm、glmer(lme4)、glm 或自制函式等函式“預定義”引數。
我會嘗試用一個小資料框來展示我的問題
y1<-(rnorm(n = 100, mean = 0, sd = 1))
y2<-(rnorm(n = 100, mean = 4, sd = 1))
x1 <- letters[1:2]; x1<- rep(x1, times =50 )
x2 <- letters[2:3]; x1<- rep(x1, times =50 )
x3 <- letters[4:5]; x1<- rep(x1, times =50 )
df<-as.data.frame(cbind(y1,y2,x1,x2,x3));df$y1<-as.numeric(df$y1);df$y2<-as.numeric(df$y2)
然后我可以很容易地像這樣適合 lm
model <- lm(y1 ~x1, data=df)
但是,我有興趣能夠做的是這樣的事情
#first define list of predictors
predictor_vector<- c("x1","x2","x3")
然后在lm()函式中使用名稱(字串)作為引數。
在此示例中,我正在使用lm()并嘗試動態構建回歸,如下所示:
model <- lm(y1 ~predictor_vector[1], data=df)
model <- lm(y1 ~predictor_vector[2], data=df)
model <- lm(y1 ~predictor_vector[3], data=df)
上面的例子不起作用。
我非常感謝您對此主題的任何投入,并希望我的示例和解釋足夠清楚。
uj5u.com熱心網友回復:
我們可以使用回圈。用reformulate或構造公式paste,并應用lm以回傳模型中的模型list
out <- lapply(predictor_vector, function(x)
lm(reformulate(x, response = "y1"), data = df))
uj5u.com熱心網友回復:
這里要理解的核心問題是lm()將型別formula作為指定回歸的第一個引數。
您已經創建了一個字串(字符)向量,但 R 不會在函式呼叫中為您動態生成公式 - 僅鍵入變數名稱作為公式的能力很方便,但在您嘗試動態時并不實用.
為了簡化您的示例,請從以下內容開始:
y1 <- (rnorm(n = 10, mean = 0, sd = 1))
x1 <- (rnorm(n = 10, mean = 0, sd = 1))
x2 <- (rnorm(n = 10, mean = 0, sd = 1))
x3 <- (rnorm(n = 10, mean = 0, sd = 1))
df <- as.data.frame(cbind(y1,x1,x2,x3))
predictors = c("x1", "x2", "x3")
現在,您可以將公式作為連接字串 ( paste0)動態創建并將其轉換為公式。然后將此公式傳遞給您的lm()電話:
form1 = as.formula(paste0("y1~", predictors[1]))
lm(form1, data = df)
正如 akrun 指出的那樣,然后您可以開始執行諸如創建回圈之類的操作來動態生成這些回圈。
您還可以執行以下操作:
my_formula = as.formula(paste0("y1~", paste0(predictors, collapse=" ")))
## generates y1 ~ x1 x2 x3
lm(my_formula, data = df)
另請參閱:具有動態變數數的公式
該頁面上的一個答案還提到了 akrun 使用函式reformulate. 來自?reformulate:
重新制定根據字符向量創建公式。如果 length(termlabels) > 1,則其元素與 連接。非句法名稱(例如包含空格或特殊字符;參見 make.names)必須用反引號保護(參見示例)。不可決議的回應現在仍然有效,兼容回傳,帶有棄用警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324597.html
標籤:r
上一篇:應用函式重復切換行的位置
