Sử dụng ~ (dấu ngã) trong Ngôn ngữ lập trình R


187

Tôi đã thấy trong một hướng dẫn về mô hình hồi quy lệnh sau:

myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

Chính xác thì lệnh này làm gì, và vai trò của ~(dấu ngã) trong lệnh là gì?


Muốn chia sẻ liên kết đến hướng dẫn? Nghe có vẻ thú vị.
cheesus

1
@cheeesus ... Tôi đã trải qua quá trình khai thác dữ liệu ebook trong R với các nghiên cứu trường hợp ... ở đó bạn có thể tìm thấy nhiều ví dụ thú vị như vậy.
Ankita

Câu trả lời:


193

Thứ bên phải <-là một formulavật. Nó thường được sử dụng để biểu thị một mô hình thống kê, trong đó thứ ở bên trái của ~phản hồi và những thứ ở bên phải của các ~biến là các biến giải thích. Vì vậy, trong tiếng Anh, bạn sẽ nói một cái gì đó như "Loài phụ thuộc vào Chiều dài Sepal, Chiều rộng Sepal, Chiều dài cánh hoa và Chiều rộng cánh hoa" .

Một myFormula <-phần của dòng đó lưu trữ công thức trong một đối tượng được gọi myFormulađể bạn có thể sử dụng nó trong các phần khác của mã R của bạn.


Sử dụng phổ biến khác của các đối tượng công thức trong R

Các latticegói sử dụng chúng để xác định các biến để cốt truyện .
Các ggplot2gói sử dụng chúng để xác định tấm cho âm mưu .
Các dplyrgói sử dụng chúng cho evaulation không chuẩn .


1
Đối với một cuộc thảo luận mở rộng hơn một chút: stackoverflow.com/questions/8055508/the-tilde-operator-in-r/
Kẻ

Phần 'công thức' của lazyevalhọa tiết giới thiệu tốt về công thức là gì
RobinL

82

R định nghĩa ~toán tử (dấu ngã) để sử dụng trong các công thức. Các công thức có tất cả các loại sử dụng, nhưng có lẽ phổ biến nhất là cho hồi quy:

library(datasets)
lm( myFormula, data=iris)

help("~")hoặc help("formula")sẽ dạy bạn nhiều hơn

@Spacesman đã bao gồm những điều cơ bản. Hãy thảo luận về cách thức hoạt động của nó.

Đầu tiên, là một toán tử, lưu ý rằng về cơ bản nó là một lối tắt đến một hàm (có hai đối số):

> `~`(lhs,rhs)
lhs ~ rhs
> lhs ~ rhs
lhs ~ rhs

Điều đó có thể hữu ích để biết để sử dụng trong applycác lệnh gia đình.

Thứ hai, bạn có thể thao tác công thức dưới dạng văn bản :

oldform <- as.character(myFormula) # Get components
myFormula <- as.formula( paste( oldform[2], "Sepal.Length", sep="~" ) )

Thứ ba, bạn có thể thao tác nó dưới dạng một danh sách :

myFormula[[2]]
myFormula[[3]]

Cuối cùng, có một số thủ thuật hữu ích với các công thức (xem help("formula")để biết thêm):

myFormula <- Species ~ . 

Ví dụ: phiên bản trên giống như phiên bản gốc, vì dấu chấm có nghĩa là "tất cả các biến chưa được sử dụng." Cái này nhìn vào data.frame bạn sử dụng trong lệnh gọi mô hình cuối cùng của bạn, xem biến nào tồn tại trong data.frame nhưng không được đề cập rõ ràng trong công thức của bạn và thay thế dấu chấm bằng các biến bị thiếu đó.


Cảm ơn câu trả lời @Ari B. Friedman nhưng dòng cuối cùng hơi mơ hồ khi bạn nói 'dấu chấm có nghĩa là "tất cả các biến chưa được sử dụng"'. Nếu bạn có thể minh họa nó hơn nữa.
Ankita

9
@Ankita, "chưa được sử dụng" trong ngữ cảnh này có nghĩa là không được đề cập đến. Trong Species~., loài là biến duy nhất đã được sử dụng. Do đó, nó phụ thuộc vào mọi biến khác trong data.frame.
x4nd3r

Tôi không hiểu myFormula <- Species ~ . . Khi dấu chấm vẫn được thay thế bằng các biến từ data.frame? Bạn có thể cung cấp một ví dụ
srghma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.